Linux 什么是信号(SIGCHLD,SIG_DFL);什么意思?

Linux 什么是信号(SIGCHLD,SIG_DFL);什么意思?,linux,signals,posix,zombie-process,waitpid,Linux,Signals,Posix,Zombie Process,Waitpid,我没有在代码中处理SIGCHLD。但我的流程在终止后立即被删除。我想让它变成僵尸进程 如果我将SIGCHLD设置为SIG_DFL,它会工作吗?如何将SIGCHLD设置为SIG\u DFL 我希望进程变成僵尸,这样我就可以在waitpid之后读取父进程中的子状态,所以您的最终目标是在子进程退出后读取父进程中的返回代码?我看这和信号没什么关系。一些示例代码是: short pid; if((pid == fork()) == 0) { // Child process do some thing h

我没有在代码中处理
SIGCHLD
。但我的流程在终止后立即被删除。我想让它变成僵尸进程

如果我将
SIGCHLD
设置为
SIG_DFL
,它会工作吗?如何将
SIGCHLD
设置为
SIG\u DFL


我希望进程变成僵尸,这样我就可以在
waitpid

之后读取父进程中的子状态,所以您的最终目标是在子进程退出后读取父进程中的返回代码?我看这和信号没什么关系。一些示例代码是:

short pid;
if((pid == fork()) == 0) {
// Child process do some thing here.
exit(n);
} else {
  int returnCode;
  while(pid != wait(&returnCode));
  // the child has terminated with returnCode
  // wait is blocking system call so u don't need to worry about busy waiting.
}

从你的问题历史来看,你似乎在为这件事纠结。以下是关于其工作原理的概述:

  • SIGCHLD的默认配置为ignore。换句话说,如果不执行任何操作,信号将被忽略,但进程表中存在僵尸。这就是为什么你可以在孩子死后的任何时候等待它的原因

  • 如果您设置了一个信号处理程序,那么该信号将被传递,您可以根据需要获取该信号,但是(以前的)子级在它死亡和您获取它之间仍然是一个僵尸

  • 如果您通过
    signal
    手动将SIGCHLD的disposition设置为SIG_IGN,则语义与第1项中的略有不同。手动设置此处置时,操作系统会在子进程死亡时立即将其从进程表中删除,并且不会创建僵尸。因此,不再有任何状态信息可获取,
    wait
    将使用ECHILD失败。(2.6.9之后的Linux内核遵循此行为。)


  • 您应该始终使用
    waitpid
    读取子状态,尤其是当您安装了
    SIGCHLD
    处理程序(或不安装该处理程序)时。读取,获取详细信息。waitpid返回-1,errno=ECHILD。所以子状态无效,并且只有一些垃圾。是的,在这里我总是从wait中得到-1(返回值)。我希望得到子pid作为wait的返回值。这样我就可以处理孩子的身份了。我的情况不是这样的。。当我检查errno时,它是ECHILD。那么如何检查SIGCHLD标志呢?请参阅用处理程序绑定信号,查看发生了什么。