1

在下面的代码中,当系统函数被执行(在 Linux 中并用 g++ 编译)时,它会将SIGCHLD信号发送到进程(从中调用它),这在 Solaris 代码中不会发生。我的意思是,如果我在 Solaris 中运行相同的代码,系统函数不会向调用它的进程发送任何信号。结果,我在 Linux 中的进程挂起。

#include <iostream>
using namespace std;
#include <cstdlib>
#include <signal.h>

void sigHandler(int sgnNbr)
{
    cout <<"Signal " << sgnNbr << "caught" << endl;
    system("echo $HOSTNAME");
    exit(1);
}

int main()
{
    signal(SIGCHLD,sigHandler);
    system("echo $HOSTNAME");
    return 0;
}  

我的问题是:

  1. 为什么进程在上述情况下挂起?
  2. 为什么系统函数在 Solaris 中不发送任何信号?

...以及我的最后一个问题,这与我的实际应用有关:

实际上,在我的实际应用程序中(其中单个信号处理程序用于处理大约四个信号),其他一些进程向我的进程发送 SIGABRT 信号,而在信号处理程序中,我正在使用系统函数杀死一个进程,结果它被挂起(这与上述情况类似)。有什么办法可以克服这个吗?

4

1 回答 1

2

来自http://pubs.opengroup.org/onlinepubs/009604499/functions/system.html

system() 函数应忽略 SIGINT 和 SIGQUIT 信号,并应阻止 SIGCHLD 信号,同时等待命令终止。

Solaris 是正确的;Linux 不正确。

system程序挂起的最可能原因是在信号处理程序中调用是不安全的。有关异步信号安全功能的列表,请参见http://pubs.opengroup.org/onlinepubs/009604499/functions/xsh_chap02_04.html#tag_02_04

要杀死另一个进程,您可以使用kill异步信号安全的 。

于 2012-08-17T14:09:51.650 回答