dポイントプレゼントキャンペーン実施中!

Solaris + Cです。

プロセス間通信でmsgsnd( )、msgrcv( )を使用しています。

プロセスAからmsgsndで送信した際に、送信電文のサイズは32バイトと設定しています。
 msgsnd(iQue,&stmsg,32,IPC_NOWAIT );

また、受信するプロセスBでも受信した電文のサイズ(rcvmsgの戻り値)は32バイトと認識しており、受信用のバッファ(下記 gRecv)も32バイト分用意しています。
 msgrcv(iMyQue,&gRecv,32,0,MSG_NOERROR);

しかし、電文の受信(msgrcv)の前後で確認したところ、受信用に用意しているgRecvのすぐ後ろの領域を破壊していることが判明しました。
※gRecvの中身にはプロセスAから送信した内容が正しく入っています。

msgrcv,msgsndの使用方法に誤りがあるのでしょうか?

A 回答 (1件)

>msgrcv,msgsndの使用方法に誤りがあるのでしょうか?


はい、誤っています。
電文を送信するときの第3パラメータ(=32)は、以下の構造体の場合、のmtextのサイズを渡す必要があります。
struct msgbuf {
long int mtype; /* message type */
char mtext[1]; /* message text */
}
従って32を指定した場合は、mtypeのサイズ+32バイトが、送り出されます。(32ビットモードでは36バイト)
受信の場合も同様に、36バイトを受信することになります。
従って、
struct msgbuf *msg;
として、

msgsnd(iQue,&stmsg,32-sizeof(msg->mtype),IPC_NOWAIT );

msgrcv(iMyQue,&gRecv,32-sizeof(msg->mtype),0,MSG_NOERROR);

とすれば、32バイト(mtypeを含めて)が送受信できます。
    • good
    • 1
この回答へのお礼

解決しました。
ありがとうございました。

お礼日時:2005/12/07 14:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!