2012-03-01 6 views
2

シグナルや共有メモリを介して子プロセスを管理するのに苦労します(私はパイプが良かったかもしれません)。いつか(キル経由)親のシグナリング後、OSがこれまでに()子どもが一時停止するさせることなく、親に切り替えるという問題があるシグナル/ポーズデッドロック

* parent processing something, then signaling the children and going into pause, 
* children processing something, then signaling the parent and going into pause, 
* etc. etc. 

:私は、次のループを持っています。それは子供が、その後一時停止し、私はデッドロックを持っている:((親が一時停止を起動した後に)子を再開します。

任意の提案を?

答えて

2

このレースを避けるには、sigprocmask()で使用している信号をブロックする必要があります。次に、pause()を添付して、信号をアトミックにブロック解除してプロセスを中断するには、sigsuspend()を使用します。

これは、プロセスがsigsuspend()を呼び出す前に信号が送信された場合、sigsuspend()まで配信されないことを意味します。

+0

ありがとう!役に立った –

2

あなたは、シグナリングメカニズムを使用して、独自のアトミックセマフォを実装しようとしていますそしてあなたはそれを動作させるためにあなたが必要となる保証を得ることはありませんので、それができません発見したとして。

を私はマルチプロセスパラダイムから移動し、代わりにpthreadsのシステムによって使用可能になる施設を検討してお勧めそれに反して、System V IPCのメカニズムを使いこなそうとするかもしれませんが、pthreadsを使う方がはるかに良いと思います。

+0

以上のPOSIX IPC同等品。 – Duck

+0

いずれにしても、pthreadsインターフェイスよりも控えめです。 : – Perry

+0

これはアプリケーションによって異なりますが、IPCは使いにくいものではありません。機能をプロセスとスレッドに分けることには利点があります。プロセスやスレッドを別々にデバッグすることを選択すると、ほとんどいつもより簡単です。 – Duck