【发布时间】:2019-04-11 07:50:11
【问题描述】:
我们有一个任务来解释这段代码。我唯一的问题是理解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;
}
【问题讨论】:
-
请格式化您的代码。
-
您只能从信号处理程序中安全地进行异步信号安全函数调用。
printf()不是异步信号安全的。见pubs.opengroup.org/onlinepubs/9699919799/functions/… -
我没有看到
case,也没有看到switch -
@TimRandall 他已经编辑了这个问题,但现在我想他在问为什么它从小写
sigaction切换到混合大小写Sigaction,而不是关于case和switch语句. -
是的,但是关于Minimal, Complete, and Verifiable example 的重点是我们不必费力地询问一个错字是真正的错字还是意外的错字,或者代码是否是 实际代码或仅类似它。
标签: c shell unix process signals