1758568 メンバー
1908 オンライン
108872 解決策
新規ポスト

msgrcvに渡すバッファサイズ

 
ハット
新しいメンバー

msgrcvに渡すバッファサイズ

初めて投稿させて頂きます。

以下のソースコードをRedHat Linux ES3 update3 上のGCCで

コンパイルして実行すると、ちゃんとメッセージ受信を待つ

ことができるのですが、msgrcvの第3引数の65519を65520に

すると、引数が不正ということでmsgrcvが失敗してしまいます

カーネルのパラメータは

/proc/sys/kernel/msgmnb が 65535

/proc/sys/kernel/msgmax が 65535

になっており、引数としては65535まで渡せると考えていました。

なにかご存じの方がいらっしゃれば、コメントをいただけると

助かります

#include

#include

#include

#include

int main() {

int key=12345;

int msgid;

int iret;

int ii=1;

char buff;

msgid=msgget(key, IPC_CREAT|0666);

iret=msgrcv(msgid, buff,

65519, ii, 0);

if (iret<0) {

perror("msgrcv");

}

return 0;

}

2件の返信2
’¬“c�•�Žu
新しいメンバー

msgrcvに渡すバッファサイズ

ES4環境がないため正確なことは言えませんが、

受信用エリアbuffの使い方が誤っていませんか?

受信用エリアbuffはchar型ではなく、

struct msgbuf型のはずです。

「struct msgbuf {

long mtype;

char mtext; /* message data */

};」

smgrcvは

「ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp,int msgflg);」

なので、とりあえずmtypeの値等をみなおしてみてはいかがですか?

ハット
新しいメンバー

msgrcvに渡すバッファサイズ

コメントありがとうございます

以下の様にちょっと修正してみました

やはりdefineした65519を65520にすると動きません

カーネルのパラメータに設定した65535に

mtypeが含まれているとしても65520で失敗する理由がわからないのです

#include

#include

#include

#include

#define MSG_SIZE 65519

int main() {

int key=12345;

int msgid;

int iret;

long msgtyp=1;

struct msgbuf {

long mtype;

char mtext; /* message data */

}buff;

msgid=msgget(key, IPC_CREAT|0666);

iret=msgrcv(msgid, &buff,

MSG_SIZE, msgtyp, 0);

if (iret<0) {

perror("msgrcv");

}

return 0;

}