首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么POSIX要求系统(3)忽略SIGINT和SIGQUIT?

为什么POSIX要求系统(3)忽略SIGINT和SIGQUIT?
EN

Stack Overflow用户
提问于 2019-05-09 06:24:56
回答 1查看 342关注 0票数 1

The POSIX规范

system()函数将忽略SIGINT和SIGQUIT信号,并在等待命令终止时阻塞SIGCHLD信号。如果这可能导致应用程序丢失一个本来会杀死它的信号,那么应用程序应该检查system()的返回值,并在命令由于接收到信号而终止时采取对应用程序合适的任何操作。

这意味着启动长期运行的子进程的程序将被SIGINTSIGQUIT阻塞很长时间。下面是在我的Ubuntu18.10笔记本电脑上编译的测试程序:

代码语言:javascript
复制
$ cat > test_system.c <<< EOF
#include <stdlib.h>

int main() {
    system("sleep 86400");  // Sleep for 24 hours
}
EOF
$ gcc test_system.c -o test_system

如果我在后台启动这个测试程序.

代码语言:javascript
复制
$ ./test_system &
[1] 7489

..Then我可以看到,SIGINT(2)和SIGQUIT(3)在位掩码中被标记为被忽略。

代码语言:javascript
复制
$ ps -H -o pid,pgrp,cmd,ignored
  PID  PGRP CMD                                  IGNORED
 6956  6956 -bash                       0000000000380004
 7489  7489   ./test_system             0000000000000006
 7491  7489     sh -c sleep 86400       0000000000000000
 7492  7489       sleep 86400           0000000000000000

试图用test_system杀死SIGINT没有效果。

代码语言:javascript
复制
$ kill -SIGINT 7489

。。但是向进程组发送SIGINT确实会扼杀它(这是预期的,这意味着进程组中的每个进程都接收到信号--睡眠将退出,系统将返回)。

代码语言:javascript
复制
   $ kill -SIGINT -7489
   [1]+  Done                    ./test_system

问题

  1. 忽略SIGINTSIGQUIT的目的是什么,因为进程仍然可以通过process组被杀死(这就是在终端中执行^C时发生的情况)。
  2. 附加问题:为什么POSIX要求阻止SIGCHLD
  3. 更新如果SIGINTSIGQUIT被忽略以确保我们不会留下孩子,那么为什么SIGTERM没有处理--这是杀死发送的默认信号!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-09 07:04:34

SIGINTSIGQUIT是终端产生的信号。默认情况下,当您分别按Ctrl+CCtrl+\时,它们会被发送到前台进程组。

我认为,在通过system运行孩子时忽略它们的想法是,终端应该像临时由孩子拥有一样,而Ctrl+CCtrl+\应该暂时只影响孩子及其后代,而不是父母。

SIGCHLD被阻塞,因此如果您有一个SIGCHLD处理程序,那么由子终止引起的systemSIGCHLD不会触发一个SIGCHLD处理程序,因为这样的SIGCHLD处理程序可能会在system获取该子处理程序之前,就获得system启动的子处理程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56053355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档