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

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


としです。

> コバヤシ@Linux暦1年 と申します。

こんにちわ。

> "プロセスA,B,C"という3つのプログラムがありまして、
> 各々のプロセスはとある状態になると、
> 共通の処理である"プロセスD"へ処理要求を出し、
> 要求を受けたプロセスDが処理を始める、ということをしています。
> 
> 現状ではプロセスA,B,CとDの間ではメッセージの送受信にて
> やりとりしていますが、これでは処理の同期は一応とれますが、
> メッセージの送受信において、常にメッセージの監視を行っているので、
> CPUに負荷がかかっています(微々たるものかもしれませんが)。

「常にメッセージの監視を行なっているので」と言う部分ですが、監視を行
なっているのは、"プロセスD" の事ですよね?。

であれば、例えばプロセス間通信にメッセージキューや、ソケットを使って
いるなら、msgrcv() か read() か recv() を呼んでいる(と思しき)
"プロセスD" は、受信データが無ければ、データが来るまで待ち状態になり
ますから、CPU 負荷はかからないはず...と思います。

ただ、もしかすると、"プロセスD" では、メッセージの受信だけでなく、何
か、他の処理も並行して行なう必要があるのでしょうか?

もし、そうであるとすると、データが来るまで待ち状態が続くと困りますの
で、受信タイムアウト的な実装を行なう手法があるかと思います。

受信タイムアウトの実装は、いくつか方法がありますが、

(1) msgrcv() / read() / recv() の直前に、alarm(TIME-OUT) を呼び出し、
    指定した秒数後にアラームシグナルを発生させ、msgrcv() / read() /
    recv() で errnoが EINTR を返すかチェックする。
    →SIGALRM(アラームシグナル)に対するシグナルハンドラを作る必要
      あり。

(2) メッセージの送受信にソケットを使っているなら、select() あるいは
    poll() システムコールを使って、タイムアウトまで待つ。

んでも、"プロセスD" 側は、単純にデータが来るのを待つ(だけが仕事)なら
ば、受信タイムアウト処理も特に必要ではないと思いますし、IPC_NOWAIT
とか、O_NONBLOCK とかを指定していなければ、データが来るまで 
"プロセスD" はカーネルにより待たされます(CPU 資源は消費しません)。

#各関数やキーワードは、man か google で探すと出てくると思います。

外していたらすみませんです。

ではこれにて。

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

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