Я реализую пользовательские потоки в ядре Linux 2.4 и использую ualarm для вызова переключений контекста между потоками.
У нас есть требование, чтобы функции нашей библиотеки потоков были бесперебойными с помощью механизма переключения контекста для потоков, поэтому я изучил сигналы блокировки и узнал, что использование sigprocmask является стандартным способом сделать это.
Однако, похоже, мне нужно сделать очень много, чтобы реализовать это:
sigset_t new_set, old_set;
sigemptyset(&new_set);
sigaddset(&new_set, SIGALRM);
sigprocmask(SIG_BLOCK, &new_set, &old_set);
Блокирует SIGALARM, но делает это с 3 вызовами функций! Многое может произойти за время, необходимое для запуска этих функций, включая отправку сигнала.
Лучшая идея, которую я должен был смягчить, это временно отключить ualarm, как это:
sigset_t new_set, old_set;
time=ualarm(0,0);
sigemptyset(&new_set);
sigaddset(&new_set, SIGALRM);
sigprocmask(SIG_BLOCK, &new_set, &old_set);
ualarm(time, 0);
Что хорошо, за исключением того, что это кажется многословным. Разве нет лучшего способа сделать это?