• 締切済み

popenについて質問です!!

こんにちは!遺伝的アルゴリズムを用いた回路の最適化について研究をしているものですが…プログラムに問題がありまして質問させていただきました。 たぶん、popenの使い方の問題だと思いますが…下のプログラムを見るとこういう部分があります。↓↓ ----------------------------------------------- if(!(p_file=popen(command,"r"))){ printf(" cannot open a pipe!!"); exit(1); } ----------------------------------------------- プログラムを動かすと何世代かは回りますが、ある世代で急にifのループに入ってしまってプログラムが止まってしまうのですが…なぜでしょうか? これってpopenの使い方が間違ってるんでしょかね? でも、約20世代までは何の問題もなく動きます。で、急にifのループに入ってしまって止まるのです。 どなたかお分かりの方がいらっしゃれば是非教えてください。よろしくお願いいたします。 ------------------------------------------- . . . . char command[100],field[81]; for(rua=0; rua<N; rua++){ for(rub=0; rub<N; rub++){ char *bp; FILE *p_file,*net_fp,*fp_outfile; net_fp=fopen("bpf.net","w"); . . . . fclose (net_fp); sprintf(command,"%s",COMMAND); if(!(p_file=popen(command,"r"))){ printf(" cannot open a pipe!!"); exit(1); } if(!(fp_outfile=fopen("bpf.out","r"))){ printf(" cannot open a output file!!"); exit(1); } . . . . pclose(p_file); . . . .

みんなの回答

  • sismoon
  • ベストアンサー率22% (22/97)
回答No.1

popenの使用方法は分かりますか? ifの条件に引っかかるということはpopenでコマンドCOMMANDを実行し, ファイルストリームを読み込みで実行しようとしたけれどできなかったということです. printfかなにかで変数COMMANDに何が代入されているか確認してみてください. もしかしたら,サポートされていないコマンドや余計な文字が入っているのかもしれません. 申し訳ないですが,このプログラムではどこでコマンドを代入しているか分からないので判断しかねます.

参考URL:
http://www.h7.dion.ne.jp/~matsu/feature/c-language/pipe/open-close.html#0
HIRO3434
質問者

お礼

回答本当にありがとうございました! ここに書ける文字が限定されてるため…プログラムを全部お見せできないのが残念です…

関連するQ&A

  • UNIX関数?(popen)について

    Cプログラムでpopen関数?を使用しコマンド(rcp)を実行するプログ ラムを造ったのですが、当分が動作していたのですが、何のタイミングか分からないのですが、失敗する時が有ります。一度失敗するとそれ以降はずーと失敗します 。どのような原因が考えられるのでしょうか? ちなみにプログラムの一部をとりあえずのせておきます。(ファイル名及び相手先 のディレクトリ名は現状存在します) 又、system関数とpopen関数の大きな違いは何でしょうか? ご教示お願い致します。 (cプログラムの一部) char buff[256] ; char cmnd[256] ; /* コマンド文字列 */ int fp_rtc ; memset( buff, NULL, sizeof(buff) ) ; memset( cmnd, NULL, sizeof(cmnd) ) ; strcpy( buff, argv[1] ) ; sprintf(cmnd, RCP_FMT , buff, RCP_DIR, buff ) ; printf( "rcp cmnd ( %s )\n", cmnd ) ; fp = popen(cmnd, "r") ; fflush(stdout) ; fp_rtc = pclose(fp) ; if ( fp_rtc != 0 ){ printf( "pclose err [ rtc:%d ] \n", fp_rtc ) ; }

  • _popen() のエラー取得

    WindowsNT/2000で_popen()を利用してコマンドを実行しているのですが、その際のメッセージを取得したいのですが、通常のメッセージは取得出来るのですが、エラーメッセージが取得出来ません。どうすればよいのでしょうか? 現在のソースは下記のようです。 int main(int argc, char* argv[]) { char str[512],*ptr; FILE *fp; if((fp = _popen("dir b:","rt")) == NULL) { fprintf( stderr , "error!!!\n"); return -1; } while(1) { fgets(str,512,fp); if(feof(fp)) { break; } ptr = strchr(str,'\n'); if(ptr != NULL) { *ptr='\0'; } printf("%s\n",str); } _pclose(fp); return 0; }

  • popen・pcloseについて

    popen・pcloseについて 以下のようにpopenを使ってdirコマンドを打った時と同じようなプログラムを Microsoft Visual C++ 2008上で作ったのですが #include <stdio.h> int main(void) { FILE *fp; char buff[64]; fp=popen("dir","r"); while(fgets(buff,sizeof(buff),fp)!=NULL){ printf("%s",buff); } pclose(fp); return 0; } これをビルドした所、以下のようなエラーが出てしまいました。 c:\users\yamaomoto\documents\visual studio 2008\projects\popen\popen\popen.c(8) : warning C4013: 関数 'popen' は定義されていません。int 型の値を返す外部関数と見なします。 c:\users\yamaomoto\documents\visual studio 2008\projects\popen\popen\popen.c(8) : warning C4047: '=' : 間接参照のレベルが 'FILE *' と 'int' で異なっています。 c:\users\yamaomoto\documents\visual studio 2008\projects\popen\popen\popen.c(14) : warning C4013: 関数 'pclose' は定義されていません。int 型の値を返す外部関数と見なします。 popen.obj : error LNK2019: 未解決の外部シンボル _pclose が関数 _main で参照されました。 popen.obj : error LNK2019: 未解決の外部シンボル _popen が関数 _main で参照されました。 C:\Users\Yamaomoto\Documents\Visual Studio 2008\Projects\popen\Debug\popen.exe : fatal error LNK1120: 外部参照 2 が未解決です。 色々と試してみたのですが解決に至りませんでしたのでよろしければ、 教えて頂けませんでしょうか?

  • セグメンテーションエラーの原因がわからず困っています

    以下のプログラムで”セグメンテーションエラーです”の文字が表示され上手いこと動きません。 何がダメなのか、ご助言を頂けないでしょうか。どうぞよろしくお願いします。環境はCentosです。 #include<stdlib.h> #include<string.h> main(){ char s[11]; FILE *fp; fp = popen("netstat -s |grep total","r"); if(fp = NULL){ printf("reading error"); exit(-2); } FILE *fp2; fp2 = fopen("file.txt","r"); fscanf(fp,"%9s",s); int a; printf("%s\n",s); a = atol(s); printf("%ld",a); pclose(fp); fclose(fp2); }

  • Perlでpopen()的なものを使って・・

    今Perlでちょっとしたアプリを作っています。 サーバはunix系でアプリの内容はコマンドの結果値をHTMLで表示させるというものです。 一度Cで作って成功しました。 簡単に書きます。(HTMLの表示部分は簡略します) int main() { char *token; char str[1024]; FILE *fp = popen("ls -la","r"); while(fgets(str,1024,fp)!=NULL){ token = strtok(str,NULL); printf("結果:%s\n",token); } exit(0); } とコマンド(例:ls -la)を実行してファイルハンドルを返してコマンドの結果値を読み取って表示させるというものなのですが、これをPerlに移行したいと考えています。 Perlをさわるのが初めてでしてネットで調べてみても なかなか参考になるものはありません。 Perlの関数にpopen()が存在するのかまたfgets()、strtok()に類似する関数がありましたらアドバイスいただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 急にプログラムが正しく動かなくなってしまった

    Macのターミナルでcのプログラムを動かしています。 今まで使えていたプログラムが、突然うまく動かなくなりました。 原因が分からないのですが、どなたかアドバイスいただけないでしょうか? プログラムは、 1)ファイル名のリストを読み込んで、 2)読み込んだ名前のバイナリファイルを全て開き 3)それらのファイルからデータを読み込んで処理 というものです。 このプログラムは同じパソコン上でもともと正しく動いていたのですが、あるとき突然、2)の段階で一部のファイルが開けなくなってしまいました。 原因を探るために、ファイルを開いて閉じるだけのプログラムに削ってみましたが、やはり症状は変わりませんでした。 同じプログラムを、別のパソコン(windows+cygwin)にコピーしてみると、ちゃんと動きます。使用中のMacに何か問題があるのかなとおもうのですが、原因が分かりません。 詳しい状況と、開いて閉じるだけの状態に削ったプログラムを以下にのせておきます。どなたか原因が分かる方、ぜひアドバイスをお願いします。 [状況] ・上記2で開きたいバイナリファイルは332個あるのですが、253個しか開けず、それ以降はCannot open (ファイル名)のメッセージが出ます(そういうメッセージを出すようなプログラムにしてあります) ・上記2でfopenの前に、これから開くファイル名を表示させてみると、ファイル名は全て正しく読み込めています。 ・開きたいバイナリデータファイルが壊れていることを想定し、バックアップからコピーし直してみましたが、やはり症状はかわりません。 ・ for (i = 0; i < FILE_NUM; i++) をつかって複数ファイルを開いていますが、最初をi=0とすると1個目から253個目までしかファイルが開けず、最初をi=1とすると、2個目から254個目のファイルまで開けますが、それ以降のファイルはやはり開けません。どういう訳か、253個だけしかファイルが開けないのです。 [プログラム] #include <stdio.h> #include <stdlib.h> #include <string.h> #define FILE_NUM 332 #define DataDir "../N2913S5601W2689E4705" #define FileList "list_BISE3.txt" #define BUFFER 256 main() { char fn[FILE_NUM][BUFFER]; FILE *fp[FILE_NUM], *fi; char buffer[BUFFER]; unsigned short i; char *p; fi = fopen(FileList, "r"); if (!fi) { printf("Cannot Open %s\n",FileList); exit(1); } for (i = 0; i < FILE_NUM; i++) { p = fgets(buffer, BUFFER, fi); if (!p) { break; } p = strchr(buffer,'\n'); if(p != NULL) { *p = '\0'; } sprintf(fn[i], "%s/%s", DataDir, buffer); printf("%s_\n",fn[i]); fp[i] = fopen(fn[i], "rb"); if (!fp[i]) { printf("Cannot Open %s\n", fn[i]); continue; } } fclose(fi); for (i = 0 ; i < FILE_NUM; i++) { fclose(fp[i]); } }

  • ファイル

    AからZまでの文字が何回出力されるか数えるプログラムなのですが、うまく出力されません。 どこを変えればよろしいでしょうか。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int count[26]; int main(void) { char str[100] = "xyzYZZ\n"; FILE *fp; char *p; int i; char ch; if((fp = fopen("myfile","w")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } p = str; while(*p){ if(fputc (*p,fp) == EOF){ printf("ファイル書き込みエラー"); exit(1); } p++; } fclose(fp); if((fp = fopen ("myfile","r")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } while((ch == fgetc(fp)) != EOF){ ch = toupper(ch); if( ch >= 'A' && ch <='Z' ) count[ch - 'A']++ ; } for( i=0 ; i<26 ; i++) printf("%c は %d 回出現\n",i + 'A', count[i]); fclose(fp); return 0; }

  • シェルでのパイプの処理の書き方で困ってます

    現段階でのプログラムを載せます (質問に必要な部分を抜粋) #include "自作のヘッダファイル(動作確認済)" void tokun ( char str[], char *chops[], int *flagment , int *pipeflagment, int *pipe, int *num){ char *buf; int i; *pipeflagment = 0; buf = str; for(i=0; i <= SIZE ; i++){ if((chops[i] = strtok(buf," \t")) == NULL) break; if( *chops[i] == '|' ){ *pipeflagment = 1; *pipe = i + 1; *num = i; } buf = NULL; } if( *chops[i-1] == '&' ){ *flagment = BACK; chops[i-1] = NULL; i--; printf("**Background Mode**\n"); }else{ *flagment = FORE; printf("**Foreground Mode**\n"); } if(i > SIZE){ fprintf(stderr,"Too many args\n"); exit(1); } } int main ( void ){ char prompt[ 64 ] = "> "; char command[ 256 ]; int st, id, j, pipenum, num; char *com[256]; enum proc_flag flag; int pipeflag ; int out; int pipe_fd[2]; int child, status; char *buf; pipeflag = 0; fprintf(stderr, "%s", prompt); while (gets(command) != NULL){ if( command == "quit" ){ kill(0, SIGKILL); } buf = command; tokun(command, com, &flag, &pipeflag, &pipenum, &num); //pipe部分の記述開始 if( pipeflag == 1){ com[num] = NULL; if(pipe(pipe_fd) < 0){ perror("pipe"); exit(1); } if((child = fork()) < 0){ perror("fork"); exit(1); } if(child) { /* parent process */ close(pipe_fd[1]); dup2(pipe_fd[0], STDIN); execvp (com[pipenum], com); close(pipe_fd[0]); if(wait(&status) < 0){ perror("wait"); exit(1); } }else { /* child process */ close(pipe_fd[0]); dup2(pipe_fd[1], STDOUT); execvp (com[0], com); // 通信の終了を子プロセスに通知 close(pipe_fd[1]); } } //pipe部分の記述終了 if((id = fork ()) == 0){ if( execvp(com[0], com) == (-1)){ exit(1); } }else { if( flag == BACK ){ waitpid(-1, NULL, WNOHANG); fprintf(stderr, "%s", prompt); }else { wait(&st); fprintf(stderr, "%s", prompt); } } } return 0; } パイプ部分が作れません・・・。 どうすればいいですか?

  • 実験で大量のデータを扱うので質問させてください。

    実験で大量のデータを扱うので質問させてください。 (javaでテキストファイル名を操作する方法に関しての質問です。) ファイルへの出力で、たとえばファイル名を「file_1.txt][file_2.txt]・・・[file_100.txt]といった具合に大量に扱いたい場合に、数値の部分を変数tとおき、以下に示すプログラムイメージのように、ファイル名を全て書かなくて済むようにしたいのですが、javaでそのようなことは可能でしょうか?方法をご存知の方がおられれば教えてください。よろしくお願いします。 (以下のプログラムはC言語でのイメージです。実際こんな書き方はできませんが、やりたいことのイメージをお伝えしたかったので) ///プログラムイメージ//////////////////////////// int t = 0; for(t=0;t<100;t++){ if((fp=fopen("file_t.txt","w"))==NULL){ printf("ファイルが開けません"); exit(1); } fprintf(fp,"%d ",a); //各ファイルにaという実験データを書き込みたい t += 1; fclose(fp); } ///////////////////////////////

    • ベストアンサー
    • Java
  • 【C言語】ファイルを読み込んで16進数で表示する

    ファイルをバイナリモードで読み込んで16進数で表示するプログラムについて質問です。 以下の処理内容が理解できません。どのような処理を行っているのでしょうか?? (xdump.c)********************************* #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int i, j; FILE *fp; if(NULL == (fp = fopen(argv[1], "rb"))) { fprintf(stderr, "Cannot open FILE[%s].\n", argv[1]); exit(1); } for(i=0; i<0x7FFF; ++i) { printf("%08X :", ftell(fp)); for(j=0; j<16; ++j) { int c; c = 0x00FF & getc(fp); if(ferror(fp)) { puts("\a>>>> Read Error ! <<<<"); break; } if(feof(fp)) break; /* 16進数で表示 */ printf(" %2X", c); } printf(" : %08X\n", ftell(fp)-1); /* : */ /* : */ /* 以下省略 */ ****************************************** 上記に関して、 最初のfor文から"c = 0x00FF & getc(fp);"までの処理内容が よくわかりません。どなたかご教授願えますでしょうか?