在下面的代码中,当系统函数执行时(在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;
}
我的问题是:
...和我的上一个问题,这与我的实际应用有关:
实际上,在我的实际应用程序中(其中单个信号处理程序有四个信号),一些其他进程将SIGABRT信号发送到我的进程和信号处理程序中我使用系统函数查杀了一个进程,因此它被绞死(这与上述情况类似)。有没有办法克服这个问题?
答案 0 :(得分: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
,这是异步信号安全的。