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

プログラムを実行したところ、こんなエラーが出てしまいました。

msgrcv failure: Argument list too long

実行したいプログラムは3つのプロセスがもつ数字を順番に並べる作業です。
1番目のプロセスはうまくいくのですが、2番目が上記のようなエラーがでてきてしまいます。

なぜでしょうか??

エラーで出てくるところは
int main( int argc, char** argv )
{
int qid;
Qmsg message;
long int myNo;
int myProp;
int data[NUM_DATA];
int isSwap = 0;
int needMinSort = 0;
int needMaxSort = 0;
int got_data;
int totalSwapNum = 0;
int i,flag,m,n,l,s;

if( argc != 2){
fprintf(stderr, "Usage: %s <own order(1-10)>\n", argv[0]);
exit(1);
}

myNo = atol(argv[1]);
if( myNo <= 0 || NUM_PROCESS < myNo ){
fprintf(stderr, "Illegal own order (%ld)\n", myNo);
exit(1);
}

switch( myNo ){
case 1:myProp = LEFT_SIDE;
printf("[%ld] is LEFT SIDE\n", myNo);
break;
case NUM_PROCESS:
myProp = RIGHT_SIDE;
printf("[%ld] is RIGHT SIDE\n", myNo);
break;
default:
myProp = MIDDLE;
printf("[%ld] is MIDDLE\n", myNo);
}

errno = 0;
if( (qid = msgget((key_t)KEY_NO, 0666 | IPC_CREAT)) == -1 ){
perror("msgget failure");
exit(1);
}

message.msgData.status = MSG_AWAKE;
switch( myProp ){
case LEFT_SIDE:
sendMsgRhs( qid, myNo, message );
break;
case MIDDLE:
recvMsgLhs( qid, myNo, &message );         //ここでエラー
if( message.msgData.status != MSG_AWAKE ){
exit(1);
}
sendMsgRhs( qid, myNo, message );
break;
case RIGHT_SIDE:
recvMsgLhs( qid, myNo, &message );
if( message.msgData.status != MSG_AWAKE ){
exit(1);
}
break;
}



int recvMsgLhs( int qid, long int myNo, Qmsg* message )
{
long int read_from = myNo;

errno = 0;
if(msgrcv(qid, message, sizeof(message->msgData), read_from, 0) == -1){
perror("msgrcv failure");
exit(1);
}
#ifdef SHOW_XFER_MESSAGE
printf("Lhs[%2ld] ---> Recv ---> [myNo:%2ld] (%s)",
message->type - 1, myNo,
msgStr[message->msgData.status]);
switch( message->msgData.status ){
case MSG_SWAP:
case MSG_NEED:
case MSG_SWAP_CNT:
printf(" {data:%d}\n", message->msgData.data);
break;
default:
printf("\n");
}
#endif

return errno;
}

A 回答 (1件)

まず、エラーメッセージを読みます。


msgrcv の不良。 Argumentの listが too long
とあります。「長過ぎる」というのがエラーの原因のようです。

> recvMsgLhs( qid, myNo, &message );         //ここでエラー

と判っているなら、そのrecvMsgLhsの内容を確認しましょう。

> perror("msgrcv failure");

と、エラーメッセージの一部と一致する文字列があります。
perror(文字列) は、 現在のerrnoに対応したエラーメッセージを「文字列: エラーメッセージ」の形で出力します。
「Argument list too long」がエラーメッセージだと判断すると、辻褄が合います。

ここにくるのは
> if(msgrcv(qid, message, sizeof(message->msgData), read_from, 0) == -1){
が成立したとき、つまり、msgrcvが-1を返したときです。

そこで、msgrcvのマニュアルを読みます。
例) http://linuxjm.sourceforge.jp/html/LDP_man-pages …

> メッセージのテキストの長さが msgsz より大きい場合の動作は、
> msgflg に MSG_NOERROR が指定されているかどうかで決まる。
> MSG_NOERROR が指定されていれば、メッセージのテキストは切り詰められる (切り捨てられた部分は失われる)。
> MSG_NOERROR が指定されていなければ、メッセージはキューから削除されず、 システムコールは -1 を返して失敗し、 errno に E2BIG が設定される。

msgflgには0が指定されているので、「MSG_NOERROR が指定されていなければ」の方が有効です。
「長過ぎる」というエラーメッセージとも合致します。

ということで
・送信側の送信量が大きい
・受信側で送信量に対して十分なバッファが用意されていない
・sizeof(message->msgData)が期待している値ではない。
ということが考えられます。

これ以上は、「送信側のプログラムが不明」「Qmsg構造体の定義が不明」「どんなメッセージを通信するかの仕様が不明」なため、回答できません。
    • good
    • 0

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