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

我没有在我的代码中处理SIGCHLD。 终止后,我的过程仍然立即被删除。 我希望它成为僵尸进程。 如果我将SIGCHLD设置为SIGDFT,那么它会起作用吗? 我如何将SIGCHLD设置为SIGDFT? 我想要进程成为僵尸,所以我可以在waitpid之后读取父进程中的subprocess。

从你的问题历史看来,你似乎正在把自己束缚在这个问题上。 以下是这个工作的概要:

  1. SIGCHLD的缺省配置是忽略的。 换句话说,如果你什么都不做, 信号将被忽略,但僵尸存在于进程表中。 这就是为什么你可以wait孩子死后的任何时候。

  2. 如果你建立了一个信号处理器,那么这个信号就被传送出去了,你可以适当的收割它,但是这个(以前的)孩子在死亡和收获之间仍然是一个僵尸。

  3. 如果您通过signal 手动将SIGCHLD的配置设置为SIG_IGN,则语义与第1项中的语义有所不同。当您手动设置此配置时,操作系统立即从进程表中删除子进程,并且不会创建僵尸。 因此,ECHILD不再有任何收获的状态信息, wait将会失败。 (2.6.9之后的Linux内核坚持这种行为。)

所以你的最终目标是在你的子进程退出后在父进程中读取返回代码? 我不认为这与信号有任何关系。 一些示例代码是:

 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. }