[2017/07/06]追加記事を書きました
[c/c++]同じidでmsgsnd()してmsgrcv()しても、msgtypeを指定すればOK
Linuxで2つのプロセスを作っていて、片方がサーバのように待ち受け、片方の要求に対して応答するようなしくみを作っていた。
どういう方法がよいのかわからなかったので、メッセージキューというものが見つかったので、msgsnd()とmsgrcv()でやろうと考えた。
最初は、クライアント側からサーバ側に要求してサーバ側の標準出力に結果を出していたのだが、それだと面倒なので、結果をクライアントに返してもらうように変更した。
何も考えず、ftok()でkeyを作り、msgget()でidを取得し、それを使っていたのだ。
が・・・動いたり動かなかったりする。
特に複雑なことはしておらず、サーバ側はmsgrcv()で待ち、クライアントがmsgsnd()したものを受信したら、結果をmsgsnd()で返してまたmsgrcv()で待ち状態になる、というだけだ。
悪かったのはいつものように私で、サーバがmsgsnd()して結果を書込んでからmsgrcv()にさっさと移行してしまうため、クライアント側がmsgrcv()で受信する前に自分で読み取ることがあったのだ。
だから、うまく行ったり行かなかったりという不安定な動きになっていた。
msgrcv()するとキューから消えてしまうので、mtypeで見分けても、もう遅い。
こんなことだったら、共有メモリにした方がやりやすかったんじゃなかろうか。
今回は、ここはまだ重要なところではないので後から見直すとしても、取りあえずでよいので回避できればよい。
どうするかというと・・・
msgrecv();
受信後の処理();
msgsnd(結果);
sleep(1);
うん、1秒くらい置いておけば相手は読んでくれるからよいだろう。
あー、ださださだ...
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。