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で信号を送信しないのはなぜですか?

...そして私の実際のアプリケーションに関連する私の最後の質問:

実際、私の実際のアプリケーション(4つのシグナルに対して単一のシグナルハンドラーが存在する)では、SIGABRTシグナルをプロセスに送信する他のプロセスとシグナルハンドラーでは、システム関数を使用して1つのプロセスを強制終了し、その結果、ハングしました(これは上記のシナリオに似ています)。これを克服する方法はありますか?

4

1 に答える 1

2

http://pubs.opengroup.org/onlinepubs/009604499/functions/system.htmlから:

system() 関数は、SIGINT および SIGQUIT シグナルを無視し、コマンドが終了するのを待っている間、SIGCHLD シグナルをブロックします。

ソラリスが正しいです。Linux は正しくありません。

プログラムがハングする最も可能性の高い理由はsystem、シグナル ハンドラー内で呼び出すのが安全でないことです。async-signal-safe 関数のリストについては、http://pubs.opengroup.org/onlinepubs/009604499/functions/xsh_chap02_04.html#tag_02_04を参照してください。

別のプロセスを強制終了するkillには、async-signal-safe を使用できます。

于 2012-08-17T14:09:51.650 に答える