C++ 与系统功能有关的问题

C++ 与系统功能有关的问题,c++,signals,C++,Signals,在下面的代码中,当系统函数被执行时(在Linux中并用g++编译),它将向进程发送SIGCHLD信号(从中调用),这在Solaris代码中是不会发生的。我的意思是,如果我在Solaris中运行相同的代码,系统函数不会向调用它的进程发送任何信号。结果,我在Linux中的进程挂起 #include <iostream> using namespace std; #include <cstdlib> #include <signal.h> void sigHand

在下面的代码中,当系统函数被执行时(在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;
}  
#包括
使用名称空间std;
#包括
#包括
无效信号发生器(int sgnNbr)
{
cout来自:

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

Solaris是正确的;Linux是错误的

程序挂起的最可能原因是在信号处理程序中调用
system
不安全。有关异步信号安全函数的列表,请参阅


要终止另一个进程,可以使用异步信号安全。

如果您阅读手册页面,您将看到
系统
不在“安全”范围内函数在信号处理程序中调用。此外,我不知道今天的Solaris,但它过去处理
SIGCLD
SIGCLD
的方式不同,可能
system
会引发
SIGCLD
信号?这里的要点是,我使用system命令以其PID终止进程。那么有没有办法kill在信号处理器中处理系统命令的过程或其他方式。请告诉我如何检查信号处理器在发生故障时为何未被阻塞linux@facebook-10000358991487您应该直接使用
kill
kill
中的一个函数)。关于Linux上的问题,可能与此相关(您提到了Solaris,所以您可能在Sparc上)。