我们有一个作业来解释这段代码。我唯一的问题是了解handle_signal函数,为什么我们使用2个新sigaction,然后将“ old_treatment”与“ rien”一起使用?
#define DELAY 1
#define NB_ITERATIONS 60
void handle_signal (int num_signal){
struct sigaction rien, old_ treatment;
printf ("Signal %d => ", num_signal);
printf ("I have received a SIGTSTP.\n");
rien.sa_handler = SIG_DFL;
rien.sa_flags = 0;
sigemptyset (&rien.sa_mask);
sigaction (SIGTSTP, &rien, &old_ treatment);
printf ("Then I sleep....\n");
kill (getpid(), SIGSTOP);
printf ("They wakes me?\n");
Sigaction (SIGTSTP, &old_ treatment, NULL);
printf ("Here we go again!\n");
}
int main (void){
struct sigaction a;
int i;
a.sa_handler = handle_signal;
sigemptyset (&a.sa_mask);
sigaction (SIGTSTP, &a, NULL);
for (i = 1; i < NB_ITERATIONS; i++) {
sleep (DELAY);
printf ("%d", i % 10);
fflush (stdout);}
printf ("End\n");
return EXIT_SUCCESS;
}
最佳答案
目的是暂时更改SIGTSTP
的操作,然后将其还原。
sigaction(SIGTSTP, &rien, &old_handler);
将其设置为默认操作,并将上一个操作保存在
old_handler
中。然后,它向自己发送一个
SIGSTOP
信号以实际挂起该进程。当返回时,表示该过程已继续,因此将旧操作放回:
sigaction(SIGTSTOP, &old_handler, NULL);
尚不清楚为什么需要这样做。如果它通过发送一个
SIGTSTP
信号而不是SIGSTOP
来中止进程,那将更有意义。在这种情况下,它需要设置默认操作,否则它将无限递归。关于c - C中的Sigaction处理程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53196981/