c - 为什么 SIGINT 不止一次停止睡眠?
问题描述
我不明白为什么在第一次执行 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);
}
}
}
解决方案
就在您进入下一个时,上一个导致SIGCHLD
儿童死亡的事件即将到来。kill
sleep
睡眠是一个可中断的功能。如果信号处理程序在您的线程中运行时运行,则将sleep
中止。因此,您继续进行下一个kill
,这将间接导致另一个SIGCHLD
,这很可能在您的下一次迭代睡眠时发生,从而导致几个跳过的睡眠。
如果您插入sleep(1)
before fork()
,它应该(实际上)将时间转移到恰到好处,以便 nextsleep(20);
不会中断。
(我将此视为一个快速而肮脏的实验。在生产代码中依赖这样的“调整”(或printf
在信号处理程序中使用)绝不是一个好主意。)
推荐阅读
- java - 使用 Spring Boot 的 Log4j2 JDBC Appender“错误无法写入数据库”
- javascript - 为什么我的 Google Maps API 回调在前面的内联脚本之前执行?
- python - PandaSQLException:(sqlite3.OperationalError)没有这样的列错误与pandasql
- python-3.x - Python:如何创建一个日期时间数组,并在分箱前为数组中的每个索引提取对应的年、月、日、小时
- jquery - laravel jquery 计数表行追加自动递增 id
- swift - 从 FileMaker 复制/粘贴后出现奇数符号
- angular - 我如何从角度将本地存储值发送到服务器
- sandbox - 使用 gnu autoconf,有没有办法构建到沙箱中?
- git - GitLab 辅助地理代码推送失败,内部 API 无法访问
- jersey - Jersey 客户端 - 发布请求给出错误“Content-Type 标头必须是 application/vnd.api+json”