2011-10-31 11 views
0

丸い穴に四角いペグを貼りつけようとしているのかどうか分かりませんが、信号を使って5,6つの子プロセスを親と調整しようとしています。私はそれらの信号を処理するための親のセットアップを持っていますCでのプロセス間通信 - なぜ失敗するのですか?

signal(1, SigControllerCarWaiting1); 
signal(2, SigControllerCarWaiting2); 
signal(3, SigControllerCarWaiting3); 
signal(4, SigControllerCarWaiting4); 
signal(5, SigControllerCarWaiting5); 

signal(6, SigControllerCarEnter1); 
signal(7, SigControllerCarEnter2); 
signal(8, SigControllerCarEnter3); 
signal(9, SigControllerCarEnter4); 
signal(10, SigControllerCarEnter5); 

そしてほとんどそれは動作します。プログラムを実行すると、何度も期待通りに完了します。しかし、ある時は、デフォルトの動作を上書きすることができず、親プロセスは「ハングアップ」のようなものを出力して終了します。

私は...のようなハンドラに

void SigControllerCarWaiting5() { signal(5, SigControllerCarWaiting5); SigControllerCarWaiting(4); } 
void SigControllerCarWaiting4() { signal(4, SigControllerCarWaiting4); SigControllerCarWaiting(3); } 
void SigControllerCarWaiting3() { signal(3, SigControllerCarWaiting3); SigControllerCarWaiting(2); } 
void SigControllerCarWaiting2() { signal(2, SigControllerCarWaiting2); SigControllerCarWaiting(1); } 
void SigControllerCarWaiting1() { signal(1, SigControllerCarWaiting1); SigControllerCarWaiting(0); } 

を再確立する信号を試してみた。しかし、それには影響を与えていないようです。時にはそれはうまくいく。それ以外のときは、シグナルテキストで失敗し、親をkillします。私はこれのすべてに非常に新しいですし、誰かが正しい方向に私を指すことができると思った。複数の受信信号を捕捉するために使用すべきシグナル(ID、機能)以外のものがありますか?

子プロセスを1つだけ実行すると、決して失敗することはありません。だから私はそれが子供たちの間の種の競争条件と関係していると仮定しています....しかし、私はそれを追跡することで進歩を遂げることができませんでした。

EDITは、さらなる調査の後、私の代わりに、信号のはsigactionを使用してお勧めのサイトを見つけました...しかし、私はまだ同じ問題を抱えているように見えます。信号が私によって処理されず、プロセスが途中で終了することがあります。

+1

[c、linuxのシグナルを使ったプロセス間同期]の可能な複製(http://stackoverflow.com/questions/6200225/interprocess-synchronization-using-signals-in-c-linux) –

+0

なぜあなたは使っていないのですか?パイプ、セマフォー、またはそれらの行に沿った何か? –

+1

システムコールの戻り値は常にチェックしてください。シグナル9(SIGKILL)が変更されていないことを伝えていたでしょう。 –

答えて

1

ライブと学ぶ...

信号を使用して、 2人の子供が同じシグナルを同時に送信した場合、最初のハンドラはハンドラで処理されますが、ハンドラがハンドラとして再確立される前に2番目のハンドラが実行され、デフォルトの動作が発生します。

sigactionに変更するとこれが防止されます。しかし、特定のシグナル(特にSIGKILLの動作を無効にすることができないため、9またはSIGKILL)ではまだ「失敗」しています。

私の解決策は、SIGactionを使用することです。は私自身のカスタム通信にSIGKILLを使用しません。

それ以上。他の人たちが示唆しているように、パイプやセマフォーがこの状況で使うのに適したツールだと思われます。

関連する問題