[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:99662] Re: [linux-users:99655] Re: プロセス間通信(シグナル)


コバヤシです。

としさん、関根さんこんにちは。

関根さんのおっしゃっていた
select_tut(2)を先週くらいに発見したものの、
少々理解に苦しみ、そのままにしています。
今回とは別の部分で使用していますので、
これは後で勉強するつもりです。


---としさん
> 「常にメッセージの監視を行なっているので」と言う部分ですが、監視を行
> なっているのは、"プロセスD" の事ですよね?。
> であれば、例えばプロセス間通信にメッセージキューや、ソケットを使って
> いるなら、msgrcv() か read() か recv() を呼んでいる(と思しき)
> "プロセスD" は、受信データが無ければ、データが来るまで待ち状態になり
> ますから、CPU 負荷はかからないはず...と思います。
>
> ただ、もしかすると、"プロセスD" では、メッセージの受信だけでなく、何
> か、他の処理も並行して行なう必要があるのでしょうか?

おっしゃるとおりです。(説明不足でスミマセン (^ ^; )
「プロセスA,B,C→処理要求→D→結果→A,B,C」
としていますので、監視は全て行っています。

> もし、そうであるとすると、データが来るまで待ち状態が続くと困りますの
> で、受信タイムアウト的な実装を行なう手法があるかと思います。
>
> 受信タイムアウトの実装は、いくつか方法がありますが、
>
> (1) msgrcv() / read() / recv() の直前に、alarm(TIME-OUT) を呼び出し、
>     指定した秒数後にアラームシグナルを発生させ、msgrcv() / read() /
>     recv() で errnoが EINTR を返すかチェックする。
>     →SIGALRM(アラームシグナル)に対するシグナルハンドラを作る必要
>       あり。
>
> (2) メッセージの送受信にソケットを使っているなら、select() あるいは
>     poll() システムコールを使って、タイムアウトまで待つ。

なるほど、アラームシグナルを使う手がありましたか!
msgsnd()、msgrcv()を使用していますので、(1)の案でやってみようと思います。
結果は後ほど...

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
References: