- 締切済み
プログラムエラー
プログラムを実行したところ、こんなエラーが出てしまいました。 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; }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
まず、エラーメッセージを読みます。 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/man2/msgop.2.html > メッセージのテキストの長さが msgsz より大きい場合の動作は、 > msgflg に MSG_NOERROR が指定されているかどうかで決まる。 > MSG_NOERROR が指定されていれば、メッセージのテキストは切り詰められる (切り捨てられた部分は失われる)。 > MSG_NOERROR が指定されていなければ、メッセージはキューから削除されず、 システムコールは -1 を返して失敗し、 errno に E2BIG が設定される。 msgflgには0が指定されているので、「MSG_NOERROR が指定されていなければ」の方が有効です。 「長過ぎる」というエラーメッセージとも合致します。 ということで ・送信側の送信量が大きい ・受信側で送信量に対して十分なバッファが用意されていない ・sizeof(message->msgData)が期待している値ではない。 ということが考えられます。 これ以上は、「送信側のプログラムが不明」「Qmsg構造体の定義が不明」「どんなメッセージを通信するかの仕様が不明」なため、回答できません。