Странное поведение сигвейта - PullRequest
2 голосов
/ 13 октября 2011

Я использую sigwait, чтобы заблокировать поток для некоторых сигналов. Эти сигналы были добавлены в набор сигмов. AS согласно документу sigwait должен ждать только сигналов, переданных ему в качестве набора в аргументе, и не должен изменять маску сигналов этого потока. Но по какой-то причине я не знаю, что это меняет маску сигналов нити. Он блокирует все сигналы, кроме тех, что в сигмах. Я не хочу, чтобы это произошло. Может ли кто-нибудь помочь мне с тем же. Спасибо заранее

Фрагмент кода:

sigset_t sigs;
int sig_recvd;
sigset_t old_mask;
sigemptyset(&sigs);
sigaddset(&sigs, SIGUSR1);
sigaddset(&sigs, SIGTERM);
sigaddset(&sigs, SIGHUP);
sigaddset(&sigs, SIGINT);
sigaddset(&sigs, SIGPIPE);
sigaddset(&sigs, SIGCHLD);

sigprocmask(SIG_BLOCK, &sigs, &old_mask);

do
{

    sigwait(&sigs, &sig_recvd);
    //Switch for some signal handling

} while(1);

Sigblk перед sigwait: 0000000080014203
Sigblk во время sigwait: fffffffefffabcfc


Я не понимаю, что не так с функцией sigwait, но когда я сделал то же самое с sigwaitinfo, у меня все получилось. Не могу понять, что заставило работать позже, но сейчас моя проблема решена. Но я хотел бы знать, есть ли какие-либо различия в реализации двух

Ответы [ 2 ]

0 голосов
/ 17 октября 2011

Почему бы не использовать pthread_sigmask () вместо sigprocmask ()

0 голосов
/ 13 октября 2011

Я не совсем уверен, что ваш вопрос, если ваш вопрос «Почему sigwait меняет sigmast во время его выполнения, а не после его выполнения», то это так, sigwait разблокирует сигнал во время его выполнения, или как он может ожидать поступления сигнала? Вот выдержка из APUE: If one of the signals specified in the set is pending at the time sigwait is called, then sigwait will return without blocking. Before returning, sigwait removes the signal from the set of signals pending for the process. To avoid erroneous behavior, a thread must block the signals it is waiting for before calling sigwait. The sigwait function will atomically unblock the signals and wait until one is delivered. Before returning, sigwait will restore the thread's signal mask. If the signals are not blocked at the time that sigwait is called, then a timing window is opened up where one of the signals can be delivered to the thread before it completes its call to sigwait.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...