man ページにsystem()
は、「コマンドの実行中に SIGCHLD がブロックされる」と記載され
ています。私のコードではSIGCHLD
、ログに何かを書き込み、シグナルを無視するためのハンドラをインストールしています。これは、ログで終了した子について知り、ゾンビ プロセスを回避するために行います。
コールを使用すると問題が発生しsystem()
ます。このハンドラーを配置すると、子の終了コードではなく、system()
常に戻ります。-1
しかし、マニュアルページからの上記の引用によるとsystem()
、子からのシグナルを処理することになっています。
私は何を間違っていますか?
私のコードは次のとおりです。
static void handleSignal(int signum, siginfo_t* inf, void* ctx) {
cout << "in signal " << signum << endl;
}
int main() {
struct sigaction chldsa, prevchld;
chldsa.sa_sigaction = &handleSignal;
sigemptyset(&chldsa.sa_mask);
chldsa.sa_flags = SA_SIGINFO | SA_RESTART | SA_NOCLDSTOP | SA_NOCLDWAIT;
if (sigaction(SIGCHLD, &chldsa, &prevchld) == -1) {
cout << "Failed setting sigaction SIGCHLD " << errno;
}
int x = system("exit 1");
cout << "RET=" << x << endl;
}