![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
プログラムを実行したところ、こんなエラーが出てしまいました。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
C言語初心者です。計算がうまく...
-
C言語のエラーについて
-
getch / putch用のヘッダ
-
C言語 遺伝的アルゴリズムでの...
-
c言語つくってみました
-
Expression: nptr != NULL
-
加減剰余のオーバーフローについて
-
SPI 非言語の問題です
-
互いに素と負の数
-
減衰係数の求め方がわかりません
-
rc直列回路の波形を観測する時...
-
実効値と平均値から波高率を求...
-
モータの巻線係数って何でしょ...
-
中学受験 規則性の問題の説明...
-
空圧・油圧回路についての質問
-
RC回路の波形をオシロスコープ...
-
火力発電 蒸気タービンのMSV、C...
-
ACレンジで観測する理由
-
必要十分条件についてです!
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
Expression: nptr != NULL
-
C言語のエラーについて
-
プログラミングが分かりません。
-
C言語 コンパイルエラー(文字...
-
C言語初心者です。計算がうまく...
-
C言語で自作ヘッダーを作ったの...
-
C言語のソースコードについて教...
-
加減剰余のオーバーフローについて
-
分割コンパイルの手順と方法に...
-
プログラムがエラーが出る原因
-
'printf':識別子が見つかりませ...
-
C言語:2つの複素数(分数)の四...
-
TCP/IP: 非ソケットに対するソ...
-
getch / putch用のヘッダ
-
doubleからintへのキャスト
-
コンソールAPIのSetConsoleScre...
-
3×3のラテン方陣をつくるプログ...
-
リターンキー又は、スペースキ...
-
コンパイルエラー (超初心者...
おすすめ情報