
プログラムを実行したところ、こんなエラーが出てしまいました。
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件)
- 最新から表示
- 回答順に表示
No.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構造体の定義が不明」「どんなメッセージを通信するかの仕様が不明」なため、回答できません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
よい行いなら、とても嫌なこと...
-
模試に遅刻しそうです。
-
あなたが “不可能” だと思って...
-
卒業証書にまつわる秘密持って...
-
から と まで ~と?
-
私は、〜賞ほど愚劣なモノはな...
-
工場なので電動機のブレーカー...
-
大学の校舎って、そこの学生で...
-
TOEIC800点って才能いりますか?
-
低圧コンデンサについて
-
学校の入試の公正性、公平性
-
設備初心者です。 2台あるポン...
-
長野県に徳川様がいるじゃん女...
-
これ『何持ち』ってゆーんか知...
-
世の中、冥界から何かが下りて...
-
戸籍の危うさ
-
大学教授の昇任基準と博士学位
-
大学のTVCM。※ホリエモンは、偶...
-
数学得意の方 教えてください
-
契約の履行着手後の解除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
3×3のラテン方陣をつくるプログ...
-
c言語プログラミングで初項を1....
-
コンソールAPIのSetConsoleScre...
-
プログラミングが分かりません。
-
TCP/IP: 非ソケットに対するソ...
-
Expression: nptr != NULL
-
加減剰余のオーバーフローについて
-
大至急です! 1,ターミナルから...
-
c言語を使用しています。英語小...
-
#include <stdio.h> #include <...
-
以下の問題のプログラムを教え...
-
アセンブリプログラムで特定の...
-
'printf':識別子が見つかりませ...
-
素数について
-
C言語で10個の数字を読み込んで...
-
C言語 コンパイルエラー(文字...
-
プログラムがエラーが出る原因
-
C/C++ return文で関数の返却値...
-
C言語初心者です。計算がうまく...
-
Cの共用体を使ったローテートに...
おすすめ情報