2014-12-10 2 views
0

У меня есть случай с двумя сигналами SIG1 и SIG2 с handler1 и handler2 соответственно. handler1 отправляет SIG2 с «kill (getpid(), SIG2)», предполагая, что getpid возвращает pid процесса, в процесс.Может ли программа работать, пока есть два сигнала в ожидании

Возможно ли, что программа выполняется некоторое время до запуска handler2?

int counter; 
void sigalrm_handler (int num) { 
    counter += 1; 
} 
int main (void) { 
signal(SIGALRM, &sigalrm_handler); 
counter = 2; 
alarm(1); 
sleep(1); 
counter -= 3; 
exit(counter); 
return 
} 
+0

Только до тех пор, пока прерывания отключены. Прерывания могут быть отключены во время (предположительно короткого) периода времени, в течение которого вы обрабатываете прерывание. Обычно это включает в себя выполнение относительно короткого фрагмента кода внутри IV (вектор прерывания) ** и ** выполнение соответствующего ISR (то, что вы называете «обработчиком»), вызывается в конце IV-кода. Если ISR занимает много времени, то сценарий, который вы описываете, может иметь место. –

+0

@ barakmanos В случае, который я описываю, нет никаких прерываний, отключенных в любом месте, а по отключенному вы подразумеваете SIG_IGN (игнорирование сигнала) или маскирование сигнала (sigprocmask)? – CodeWithPride

+0

Мой комментарий, вероятно, более подходит для системы с одним процессом (с несколькими ISR и, возможно, с несколькими потоками). –

ответ

1

Да, это возможно. Сигналы, переданные в один процесс, не обрабатываются немедленно (возможно, сигнал в реальном времени делает это таким образом, я не уверен в этом).

Ядро Linux (ядро linux 1.0 наверняка) обработает ожидающие сигналы при возврате системных вызовов или в контекстном коммутаторе (планирование процесса ядра). Он не может сильно измениться в следующей версии.

Вы можете проверить this и this для справки, но это довольно неполно.

+0

в следующем коде: 'int counter; void sigalrm_handler (int num) { counter + = 1; } int main (void) { сигнал (SIGALRM, & sigalrm_handler); counter = 2; сигнализация (1); сон (1); счетчик - = 3; выход (счетчик); return 0; } ' по вашим объяснениям, всегда ли необходимо, чтобы обработчик для будильника запускался после возвращения из системного вызова сна? – CodeWithPride

+0

Я отредактировал вопрос с кодом в предыдущем комментарии. – CodeWithPride

+0

«сигнал» может быть прерван сигналом, который не игнорируется и возвращает число секунд, оставшихся до сна, в вашем случае SIGALRM. Также обратите внимание: из man-страницы 'signal':' sleep() 'может быть реализовано с использованием SIGALRM, смешение вызовов с сигналом тревоги() и sleep() - плохая идея – D3Hunter

Смежные вопросы