я получаю следующий код, который запутать меня так месивосигнала интерактивного UNIX
static jmp_buf env_alrm;
static void sig_alrm1(int signo){
longjmp(env_alrm,1);
}
unsigned int sleep2(unsigned int nsecs){
if(signal(SIGALRM ,sig_alrm) == SIG_ERR)
return(nsecs);
if(setjmp(env_alrm) == 0){
alarm(nsecs);
pause();
}
return(alarm(0));
}
static void sig_int(int);
int main(void){
unsigned int unslept;
if(signal(SIGINT,sig_int) == SIG_ERR)
err_sys("signal (sigint) error");
unslept = sleep2(5);
printf("sleep2 return ed :%u\n" ,unslept);
exit(0);
}
static void sig_int(int signo){
int i,j;
volatile int k;
printf("\nsig_int staring\n");
for(i = 0;i<30000;i++)
for(j = 0;j<4000;j++)
k += i *j;
printf("sig_int finished");
}
в то время как функция сна работает, если я нажимаю Ctrl + C. Что происходит на самом деле? Неужели он проигнорирует SIGALRM и запустит sig_int, а затем выйдет?
Последний параграф имеет первостепенное значение для понимания того, что происходит с кодом. Целью с обработчиком для 'SIGINT' является то, что он работает более 5 секунд (отсюда вложенные циклы), и он показывает, как это не является хорошей реализацией' sleep() ', потому что оно отменяет выполнение' sig_int () 'когда запускается' SIGALRM'. Цель этого примера - показать, что даже если 'longjmp' /' setjmp' разрешает условие гонки с помощью 'pause()', они вносят проблему потенциальной отмены других обработчиков в середине выполнения. –