gpt4 book ai didi

c - 为什么 SIGINT 停止 sleep 不止一次?

转载 作者:太空宇宙 更新时间:2023-11-04 02:22:12 24 4
gpt4 key购买 nike

我不明白为什么在第一次执行 kill 函数后,sleep 函数没有暂停父进程。SIGINT 传递后,会生成许多进程。此外,似乎生成了可变数量的进程。是否需要 SIGINT 的处理程序来清除挂起信号中的第一个 SIGINT?

void handler(int s) {
int status;
wait(&status);
printf("\n in the handler");
if (WIFSIGNALED(status)) {
int sig=WTERMSIG(status);
printf("\n child stopped by signal %d\n",sig);
}
if (WIFEXITED(status)) {
int ex=WEXITSTATUS(status);
printf("\n child stopped with exist status %d\n",ex);
}
}

int main() {
int pid,len, count, ret;
char s[1024];
signal(SIGCHLD,handler);
while(1) {
pid=fork();
if (pid==0) {
printf("\n Write something ");
scanf("%s",s);
len=strlen(s);
printf("\n Characters: %d",len);
return 1;
}
else {
sleep(20);
kill(pid,SIGINT);
}
}
}

最佳答案

上一个导致 child 死亡的 kill 发出的 SIGCHLD 就在您进入下一个 sleep 时到达。

sleep 是一个可中断的功能。如果信号处理程序在您的线程处于其中时运行,则 sleep 将中止。因此,您将继续执行下一个 kill,这将间接导致另一个 SIGCHLD,这很可能会在您的下一次迭代休眠时发生,从而导致多次跳过休眠。

如果您在 fork() 之前插入 sleep(1),它应该(实际上)恰好转移时间以便下一个 sleep(20); 不间断。

(我将其视为一个快速而肮脏的实验。在生产代码中依赖这样的“调整”绝不是一个好主意(或在中使用 printf信号处理程序)。)

关于c - 为什么 SIGINT 停止 sleep 不止一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56045143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com