2016-05-28 15 views
0

私は継続的にその親との間で信号を送受信しなければならないゲームサーバーをシミュレートします。シナリオは次のとおりです。連続して2つのプロセスに信号を送る方法

  • 親はゲームに信号を送ります。
  • ゲームは、信号をキャッチし、親に信号を送ります。
  • 親が信号をキャッチし、ゲームに再び信号を送ります。

のように...

問題が停止し、最初のラップの後に受信または送信することです:

static int game_s; 
void game() 
{ 
    printf("game\n"); 
    signal(SIGUSR1,game); 
    sleep(1); 
    kill(getppid(),SIGUSR1); 
    pause(); 
} 
void parent() 
{ 
    printf("parent\n"); 
    signal(SIGUSR1,parent); 
    sleep(1); 
    kill(game_s,SIGUSR1); 
    pause(); 
} 
void main() 
{ 

    game_s = fork(); 
    if(game_s>0) 
    {  
     signal(SIGUSR1,parent); 
     sleep(1); 
     kill(game_s,SIGUSR1); 
     pause(); 
    } 
    else 
    { 
     signal(SIGUSR1,game); 
     pause(); 
    } 
} 

出力は以下の通りです:

game 
parent 

なぜここに止まったの?関連するシグナルハンドラが残されていたまで、ゲームサーバキャッチ親の信号とプリント「ゲームは」再び...

+0

子が子をシグナリングしておらず、親が自分のシグナリング自体(コード内の親)をシグナリングしていませんか。このような状況では、私は通常、セマフォとその2つを導入します。 1つは親を待ち、もう1つは子が待ち、2つがループ中である –

+1

信号はほとんどIPCを実装するには悪い選択です。 SHM、パイプ、ソケット、MQ – alk

+0

子供は自分自身に信号を送ることはなく、作成された子供のpidを保存するgame_sにSIGUSR1を送信します...そうではありませんか? –

答えて

2

は、デフォルトでは、特定の信号の受信が瞬間からブロックされるべきではないプロセスは、この特定の信号を受けました。 man 3 signalから

void (*signal(int sig, void (*func)(int)))(int); 

[...]

信号が発生し、機能にFUNC点は、実装定義と同等かどうかである。

  signal(sig, SIG_DFL); 

が実行され、または実装は、OCからの信号のいくつかの実装定義セットを(少なくともSIGを含む)を防止します現在のシグナル処理が完了するまでカーリングします。

(1が移植性の理由から、任意の方法を行う必要がある)sigaction()の代わりに、signal()経由で取り扱う信号を確立し、この動作を変更します。

sigaction()struct sigactionかかります。後者の会員sa_flagsSA_NODEFERに設定する必要があります。 Linux' man 2 sigactionから

SA_NODEFER

独自のシグナルハンドラ内から受信されてからの信号を阻止しないでください。このフラグは、シグナルハンドラを確立する場合にのみ意味があります。

POSIX words this differently

SA_NODEFER

設定とSIGがキャッチされ、 SIG は、シグナルハンドラ へのエントリで スレッドのシグナルマスクに追加されるものではない場合sa_maskに含まれている場合を除きます。そうでなければ、sigは、シグナルハンドラ へのエントリ時に、スレッドのシグナルマスクに常に追加されます。


各シグナルハンドラは、それが呼び出されますたびに割り当てられた独自のスタックです取得しますので、遅かれ早かれ、この再帰的なピンポンは、メモリ不足の状態で終わることに注意してください。

+1

ありがとう、それは問題を解決した。私はsigactionを使用していましたが、simlicityの例ではsignal()を使用しましたが、フラグSA_NODEFERは欠落していました。それは今働く。 –

0

これを行うには、メッセージキューまたは共有メモリを使用します。上記のように、これは最終的にはメモリ不足となり、クラッシュします。

関連する問題