• 締切済み

プログラムエラー

プログラムを実行したところ、こんなエラーが出てしまいました。 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; }

みんなの回答

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

関連するQ&A

  • プログラムの関数化

    皆様に助けていただき、なんとかコーディング出来たのですが、関数化したいと思います。アドバイスお願いします。 int overflow_check1(); int overflow_check2(); int overflow_check3(); int overflow_check4(); int lop; // 左のオペランドに入力する値 int rop; // 右のオペランドに入力する値 int result; // 計算結果 int mod; // 除算の余り int max = INT_MAX; // 表現可能な最大値 int min = INT_MIN; // 表現可能な最小値 char *check; // 変換不能な文字を格納 char op; // 入力する演算子 int main ( int argc, char *argv[] ) { /* 引数の個数チェック */ if ( argc != 4 ) { printf ( "usage : %s lop op rop\n", argv[0] ); exit ( 0 ); } /* 引数を取得して整数型に変換 */ lop = atoi ( argv[1] ); rop = atoi ( argv[3] ); /* 引数の取得 */ op = ( argv[2][0] ); /* startが整数であるか文字であるかのチェック */ lop = strtol ( argv[1], &check, 10 ); if ( errno != ERANGE ) { if ( *check != '\0' ) { printf ( "error : 整数を入力して下さい。\n" ); exit ( -1 ); } /* startに範囲を超えた値を入力した場合 */ } else { printf( "error : 整数型の範囲を超えました。\n" ); exit( -1 ); } /* endが整数であるか文字であるかのチェック */ rop = strtol ( argv[3], &check, 10 ); if ( errno != ERANGE ) { if ( *check != '\0' ) { printf ( "error : 整数を入力して下さい。\n" ); exit ( -1 ); } /* endに範囲を超えた値を入力した場合 */ } else { printf( "error : 整数型の範囲を超えました。\n" ); exit( -1 ); } /* argv[2]が2文字以上の場合 */ if ( strlen ( argv[2] ) >= 2 ) { printf ( "error : 演算子を正しく入力して下さい。\n" ); exit ( -1 ); } /* argv[2]に入力された演算子が'+'の場合 */ switch ( op ) { case '+': overflow_check1(); result = lop + rop; break; /* argv[2]に入力された演算子が'-'の場合 */ case '-' : overflow_check2(); result = lop - rop; break; /* argv[2]に入力された演算子が'*'の場合 */ case '*': overflow_check3(); result = lop * rop; break; /* argv[2]に入力された演算子が'/'の場合 */ case '/' : /* 0による除算 */ if ( rop == 0 ) { printf ( "error : 0による除算は禁止です。\n" ); exit ( -1 ); } overflow_check4(); result = lop % rop; // 剰余を求める break; default: printf ( "error : '+' '-' '*' '/'のいずれかの演算子を入力して下さい。\n" ); exit ( -1 ); } /* 割り算の結果として余りが出なかった場合 */ if ( result == 0 ) { result = lop / rop; printf ( "%d %c %d = %d", lop, op, rop, result ); exit ( 0 ); /* 割り算の結果として余りが出た場合 */ } else { result = lop / rop; mod = lop % rop; printf ( "%d %c %d = %d余り%d", lop, op, rop, result, mod ); exit ( 0 ); } /* 数値1 演算子 数値2 = 演算結果の形式で出力する */ printf ( "%d %c %d = %d", lop, op, rop, result ); exit ( 0 ); } int overflow_check1 () { /* オーバーフローのチェック */ if ( lop > 0 && rop > 0 ) { if ( lop > max - rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } /* オーバーフローのチェック */ if ( lop < 0 && rop < 0 ) { if ( lop < min - rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } return 0; } int overflow_check2 () { /* オーバーフローのチェック */ if ( lop > 0 && rop < 0 ) { if ( lop > max + rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } /* オーバーフローのチェック */ if ( lop < 0 && rop > 0 ) { if ( lop < min + rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } return 0; } int overflow_check3 () { /* オーバーフローのチェック */ if ( lop > max / rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( -1 ); } /* オーバーフローのチェック */ if ( rop < max / lop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } return 0; } int overflow_check4 () { /* オーバーフローのチェック */ if ( ( lop == min ) && ( rop == -1 ) ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( -1 ); } return 0; }

  • C言語エラー

    C言語をいじっているのですが、16行目と19行目の「型」の前に「;」がありませんと表示されます。 どこをどう改善すればいいか教えてもらえないでしょうか /*遊び半分*/ #include <stdio.h> #include <process.h> int main() { char dear; printf("ああああ\n"); printf("ああああ \n"); scanf_s("%c", &dear); switch (dear){ case 'A04': ; int main(void); { printf("ああああ\n"); int main(void); printf("あああ\n"); printf("あああ\n"); break; system("pause"); return 0; } case 'C34' : printf("\n"); break; case 'E24' : printf("\n"); break; case 'F38' : printf("\n"); break; default: printf("メッセージはありません\n"); break;} return 0;

  • このプログラムの問題点を教えてください。

    いつもお世話になっております。 また質問させていただきます。 あるサイトの課題を自分なりにやってみました。 問題文 クイズを3題出題し、ユーザの解答に応える(「正解」とか「不正解」とか言う)プログラムを書いてください。   クイズは何でもかまいません。 それで作ってみたプログラムがこれです。 #include <stdio.h> int main(void){ int x,y; printf("1234\n"); scanf("%d",&x); switch(x){ case 0: return 0; case1: printf("hgfhgfhsa\n"); break; case2: printf("hjtuyer\n"); break; case3: printf("uytcbbvxbn\n"); break; case4: printf("oiu68fgfd\n"); break; } while(1){ printf("haydhgfsjd?\n"); printf("1,kukakaka 2,hihihi 3,yayay\n"); scanf("%d",&y); if(y == 1){ printf("763827648327ue\n"); break; } else if(y == 2){ printf("menndokusai\n"); break; } なんとかコンパイルができました。本当は3問問題を書かなければいけないのですが2問目が終わって確認の意味でコンパイルしました。 それで実行してみたところ、1問目の答えが出ませんでした。自分でも理由がわかりません。 なので皆様に問題点を指摘してほしいのです。 へんな質問ですがよろしくおねがいします。

  • バグが直りません

    山手線すごろくのプログラムをC言語で作ろうと思い、以下のように作りました。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<conio.h> char st[][80]={"東京", "神田", "秋葉原", "御徒町", "上野", "鶯谷", "日暮里", "西日暮里", "田端", "駒込", "巣鴨", "大塚", "池袋", "目白", "高田馬場", "新大久保", "新宿", "代々木", "原宿", "渋谷", "恵比寿", "目黒", "五反田", "大崎", "品川", "田町", "浜松町", "新橋", "有楽町", "東京"}; int now=0; int dicenum=1; int pt=30; int stlength=30; int dice(void){ int dc; srand(time(NULL)); dc=rand()%6+1; return dc; } int event(void){ int eve; srand(time(NULL)); eve=rand()%9+1; return eve; } void step(void){ now++; } int turn(void){ int i, d, ev; for(i=1;i<=dicenum;i++){ d+=dice(); } printf("ダイス目は%dです。\n", d); for(i=1;i<=d;i++){ now++; printf("%s\n", st[now]); if(now==stlength){ return 1; } } ev=event(); switch(ev){ case 1: printf("プラス10pt\n"); pt+=10; break; case 2: printf("プラス20pt\n"); pt+=20; break; case 3: printf("プラス50pt\n"); pt+=50; break; case 4: printf("マイナス10pt\n"); pt-=10; break; case 5: printf("マイナス20pt\n"); pt-=20; break; case 6: printf("マイナス50pt\n"); pt-=50; break; case 7: printf("急行\n"); dicenum=2; break; case 8: printf("特急\n"); dicenum=3; break; case 9: printf("新幹線\n"); dicenum=4; break; } if(pt<=0){ return 2; }else{ return 0; } } int main(){ srand(time(NULL)); int status=0; char a; printf("鉄道すごろく(JR山手線)\n"); printf("エンターキーでスタート\n"); scanf("%c", &a); while(1){ while(getch()!='\r'){ ; } if(status==0){ printf("現在地:%s\n%dポイント\n", st[now], pt); status=turn(); }else if(status==1){ printf("ゴール!おめでとう!\n"); break; }else if(status==2){ printf("残念!ポイントがなくなりました。ゲームオーバー。\n"); break; } } return 0; } コンパイルは通ったのですが実行すると"ダイス目は1873695976です。"などとダイス目がものすごく大きな値になってしまいます。原因が全く分からないのでどなたかよろしくお願いします。

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • ジャンケンプログラム作ったんですが動作しません。

    Borland C++とVisualC++の両方でEXEまで出来るのですが、起動させてグーチョキパーの手の選択をしてリターンキーを押すと、エラーウィンドが出てしまいます。 いろいろ考えて見たのですが理由が分かりません。 どうか、バグの原因を教えてください。 #include <stdio.h> #include <stdlib.h> #include <time.h> void show_title(void); void match(void); void comp_match(void); void judge(void); void p_memory(void); int playerhand=1; //プレイヤーの手 int computerhand=0;//コンピューターの手 int win=0;//勝利数 int lost=0;//負け数 int draw=0;//引き分け数 int main(void) { while(playerhand!=0) { show_title(); match(); comp_match(); judge(); p_memory(); } return 0; } void show_title(void) { printf("ジャンケンゲームver0.1\n"); printf("製作 ForceFeed 2009/4.13\n"); } void judge(void) { if(playerhand==computerhand){ printf("引き分けですね"); draw++;//引き分けのカウント }else if(playerhand==1 && computerhand==2){ printf("あなたの勝ちです\n"); win++;//勝ちのカウント }else if(playerhand==2 && computerhand==3){ printf("あなたの勝ちです\n"); win++;//勝ちのカウント }else if(playerhand==3 && computerhand==1){ printf("あなたの勝ちです\n"); win++;//勝ちのカウント }else{ printf("あなたの負けです\n"); lost++;//負けのカウント } } void match(void) { printf("1:グー 2:チョキ  3:パー 0:終了 半角数字で入力してください>"); scanf("%d",playerhand); switch(playerhand) { case 1: printf("あなたの手 :グー\n"); break; case 2: printf("あなたの手 :チョキ\n"); break; case 3: printf("あなたの手 :パー\n"); break; case 0: printf("終了します。\n"); exit(0); default: printf("0、1,2,3以外の入力がありました"); break; } } void comp_match(void)//コンピューターの手 { srand((unsigned)time(NULL));//乱数の種 computerhand=rand()%3+1; switch(computerhand) { case 1: printf("コンピューターの手 :グー\n"); break; case 2: printf("コンピューターの手 :チョキ\n"); break; case 3: printf("コンピューターの手 :パー\n"); break; default: printf("1,2,3以外の入力がありました\n"); break; } } void p_memory(void) //記録表示 { printf("勝ち数 %d\n",win); printf("勝ち数 %d\n",lost); printf("勝ち数 %d\n",draw); }

  • 出力されない・・・。

    #include <stdio.h> #include <stdlib.h> #include <string.h> void Rank(int, char*); main() { int a; char msg[100]; printf("数字を入れてください\n"); scanf("%d",&a); Rank(a, msg); printf("順位%s\n",msg); } void Rank(int a_p, char *msg_p) { switch(a_p) { case 1: msg_p = "1番"; break; case 2: msg_p = "2番"; break; case 3: msg_p = "3番"; break; case 4: msg_p = "4番"; break; case 5: msg_p = "5番"; break; } } 上のプログラムのように関数を使ってプログラムを作ったのですがmsgが出力されないのはなぜでしょうか?

  • プログラムの画面表示のことで

    このような場面で、プレイヤーが倒されてしまったときに、 HPが0にならずに、残ってしまいます。 処理が上から下に向かって動いているためだと思いますが、 プレイヤーやモンスターが倒れた時に、画面の構成を変えずに、 HPを0にすることができるでしょうか? int main(void) { system("cls"); //クリアー dungeon( /* 略 */); //ダンジョン表示(ステータスの表示) player_turn( /* 略 */);//キー入力(プレイヤーのターン) monster_turn( /* 略 */); //モンスターのターン } return 0; } //ダンジョン表示 void dungeon(PC *pc, MC *mc) { for(y=0; y<10; ++y){ for(x=0; x<10; ++x){ if(pc->y==y && pc->x==x){ printf("%s", "@"); }else if((mc->y==y) && (mc->x==x) && (mc->hp>=0)){ printf("%s", "Sk"); }else if(field[y][x]==9){ printf("%s", "■"); }else if(field[y][x]==8){ printf("%s", "□"); }else if(field[y][x]==7){ printf("%s", "<"); }else{ printf("%s", " "); } } status(pc, mc, y); //ステータスのある場所 printf("\n"); } } //ステータス表示 void status(PC *pc, MC *mc, int y) { switch(y) { case 0:printf(" *****************************");break; case 1:printf(" %s Lv%3d HP%3d %3dG", pc->name, pc->lv, pc->hp, pc->gold);break; case 2:break; case 3:break; case 4:break; case 5:break; case 6:break; case 7:break; case 8:printf(" %s Lv%3d HP%3d %3dG", mc->name, mc->lv, mc->hp, mc->gold);break; case 9:printf(" *****************************");break; default:break; } }

  • 銀行のATMを想定したプログラム

    銀行のATMを想定したプログラム だいたい出来上がったのですが、 error C2143: 構文エラー : ';' が '型' の前にありません。 と出るのですがよくわかりません。 どこが違うのか指摘お願いします。 #include<stdio.h> void gamen();//メニュー画面を表示するユーザ関数をつくる。 int syori(int);//番号を入力した場合の処理はユーザ関数で作り、main関数から呼び出す。 int zandaka; int main(void) { int no,zandaka=100; printf("いらっしゃいませ\n"); do{ gamen(); scanf("%d",&no); int syori(int no); }while(no!=4); return 0; } void gamen() { printf("ご希望のメニューを入力してください\n" "1、お預け入れ\n" "2、残高照会\n" "3、おひきだし\n" "4、終了\n"); } int syori(int no) { int nuwkin,orosu; switch (no){ case 1:printf("お預入れ>"); scanf("%d",&nuwkin); zandaka=zandaka+nuwkin; printf("残高は%d円になります\n\n",zandaka); break; case 2:printf("残高は%d円です\n\n",zandaka); break; case 3:printf("おひきだし額は>"); scanf("%d",&orosu); if(orosu>zandaka){ printf("おひきだし額限度額は%dです" "残高不足なので引き出せません",zandaka); } else { if (zandaka>orosu){ zandaka=zandaka-orosu; printf("残高は%d円になりました",zandaka); } } break; case 4:printf("ありがとうございました\n\n"); break; default:("もう一度ご希望のメニューを入力\n"); } }

  • scanfに文字が入力されたときにエラー表示させる

    こんばんは.C言語勉強中です. 以下にsizeofを用いて各データタイプのサイズを表示させるプログラムを作りました.プログラム全文は下に貼付けました.これは,1-7までのいずれかの数字を入力すると,それに対応したサイズが表示されます.1-7以外の数字が入力されると,Type 1 - 7, please,と表示され,再び数字を入力出来ます.このプログラムは数字を入力している間はうまく機能していると思います. ただ,文字を入力すると無限ループに陥ってしまいます.僕は以下の scanf("%d",&typed); で10進数で読み込んで, if(typed<1 || typed >7) とすれば,文字も含めて全ての入力に対して排除できるかと思ったのですが,これではダメなようです. こういう場合,どうやって文字の入力に対するエラーを表示させるのが一般的なのでしょうか? 素人質問ですみません.よろしくお願いします. #include <stdio.h> #include <stdint.h> #include <Windows.h> int8_t main() { int typed; while(1) { while(1) { printf("Type the data type you wanna know the size of\n"); printf("char 1, short 2, int 3, long 4, long long 5, float 6, double 7: "); scanf("%d",&typed); printf("What you typed is %d\n",typed); if(typed<1 || typed >7) { printf("Type 1 - 7, please\n"); Sleep(1000); continue; } else { break; } } printf("Data size is "); switch(typed){ case 1: printf("%d\n",sizeof(char)); break; case 2: printf("%d\n",sizeof(short)); break; case 3: printf("%d\n",sizeof(int)); break; case 4: printf("%d\n",sizeof(long int)); break; case 5: printf("%d\n",sizeof(long long)); break; case 6: printf("%d\n",sizeof(float)); break; case 7: printf("%d\n",sizeof(double)); break; default: printf("Unexpected Value!\n"); break; } Sleep(2000); } return(0); }