• ベストアンサー

UNIX関数?(popen)について

terra5の回答

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

>system関数とpopen関数の大きな違いは何でしょうか? systemは指定されたコマンドを実行するプロセスを生成し、完了するまで呼び出したほうはwait状態になります。 popenはどちらのプロセスも動作状態になります。 また、popenされた場合標準入出力がpopenの戻り値である FILE *にリダイレクトされていますが、systemは元と同じものを使用します。 また、pclose()でプロセスがまだ実行中の場合はkillされます。 質問のプログラムだと、systemを使うべきで, popenを使うのは変に思えますが。 popenは本来プロセス間でファイルi/oによる同期処理が必要な場合に使うものですから。 systemだとwaitするから嫌だと言う話なら,forkしてexecするべきでしょう。 不調の原因はプロセスが完了する前にpcloseしているかららも知れません。

hiropop
質問者

お礼

ありがとうございました

関連するQ&A

  • 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 が未解決です。 色々と試してみたのですが解決に至りませんでしたのでよろしければ、 教えて頂けませんでしょうか?

  • _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について

    現在、UNIX同士の通信で以下のような処理をしています。 fp = popen( "rsh -l user host /xxx/yyy/zzzzz > aaa.txt", "w" );      : ret = fprintf( fp, "%s\n", buff );      : ret = fprintf( fp, "%s\n", buff ); pclose( fp ); 今回、こちらをWindowsPC(XP,C/C++で開発)に変更しようとしています。 相手は変更せずに、同じことをするには、どういう方法があるのでしょうか?

  • 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); . . . .

  • 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
  • reallocについて

    現在、領域を拡張しながら、 ファイルを読み込んで呼び元に返却するPGを作成しています。 reallocがうまくいかないので、試しに小さいのを作って みましたが、これだとreallocの2度目で落ちます。 100文字ずつ呼んでいるので、拡張も100文字ずつ行っています。 メモリ確保に失敗なら、まだ分かるのですが、 ちょっと理由がわかりません。 reallocを複数繰り返していることも問題だと思いますが、 まずは正常に処理を流したいと考えています。 よろしくお願いします。 ~~~~~~ソース~~~~~~~~ //ファイルを読み込んでから領域を確保する #include <stdio.h> #include <string.h> #include <stdlib.h> #define BUFF 100 int main() { FILE *fp; char tmp[BUFF+1]; char *str; int len = 0; fp = fopen( "c:/test.txt" , "rb" ); if(fp ==0){ printf("ファイルがありません\n"); return -1; } //領域を初期化 str = (char *)malloc(1); memset(str,'\0',sizeof(str)); while(feof(fp)==0){ memset(tmp,'\0',sizeof(tmp)); fgets(tmp,BUFF,fp); //領域を再確保 len += BUFF+1; if(NULL == ((char *)realloc(str,len))){ printf("メモリ確保エラー"); } //読み込んだ値を変数に追加 strcat(str,tmp); } printf("文字列\n\n%s\n",str); printf("長さ:%d\n",len); fclose(fp); return 0; }

  • if文で…

    いつもお世話になっております。 ------------------------ typedef struct douken_ { char tiku[11]; char ken[9]; } douken; int main(void){ FILE *fp; douken dou [100]; char buff [18 /* douken */ + 2 /* CrLf(\n\r) */ + 1 /* \0 */]; int i; i = 0; fp = fopen("ex3.fil","rb"); if ( fp == 0 ){ printf("can't open\n"); exit(1); } memset (dou , '\0' , sizeof dou); memset (buff, '\0' , sizeof buff); 問題はここから----------------- while (fgets(buff,sizeof buff,fp) != NULL){ memcpy(&dou[i].tiku ,buff,10); memcpy(&dou[i].ken ,buff+10,10); if (&dou[i].tiku == &dou[i-1].tiku){ printf("%s %s",&dou[i-1].tiku,&dou[i].tiku,&dou[i].ken);} else{ printf("-----------------------"); } ------------------------ 上記のプログラムでは ファイルから読み込んだデータを 構造体に格納して if文で現データと全データを 比較するという処理をしています。(つもり) 構造体に格納するところまでは 出来たのですが if文のところが上手く行きません。 例えば 現データ(tiku)関東地区 前データ(tiku)関東地区 と、同じ場合は 関東地区 東京 と、表示したいのに ----------- と、elseの処理をしてしまいます。 対処方法をご存じでしたら、 ご教授して頂けたら幸いです。

  • popen使用時の実行速度

    お世話になります。1000以上のファイルがあるディレクトリを再帰的に走査するのに、 fp = _popen("dir /s /b *.jpg", "r"); while (fgets(fn, sizeof(fn), fp) != NULL) { //処理内容 } _pclose(fp); のようにしました。ここでint型の変数をインクリメントして100毎に表示させて実行速度を確認すると、明らかに後になるほど速度が低下していました。 タスクマネージャーで確認しましたが、メモリも一定でメモリリークを起こしているわけでも無いようです。 原因は何でしょうか?

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

    以下のプログラムで”セグメンテーションエラーです”の文字が表示され上手いこと動きません。 何がダメなのか、ご助言を頂けないでしょうか。どうぞよろしくお願いします。環境は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); }

  • popen について

    popen() を使いこなせるようになろうとしているのですが、少し難しくてつまづいています。この関数は基本的に、指定したスクリプトをバックグラウンドで実行させるためのもの、と考えてよろしいでしょうか? マニュアルを読んでわからなかった言葉があります。「パイプ」「片方向ストリーム」 なのですが、検索して、パイプはなんとなく出入力先のポートだということが書いてあったのですが、いまいちピンときません。パイプを経由することで生まれるメリットのようなものはあるのでしょうか? 次に、ファイルポインタなのですが、スクリプトを実行させるのになぜこれが必要になるのでしょうか?おそらくほとんどのスクリプトがファイルの先頭にポインタを置く必要があると思うのですが、例えば'a'などとして、最後に置くとスクリプトが実行されなくなったりしませんでしょうか? 現在の理解度では popen("php -f $script", "r"); exec("php -f $script > /dev/null &"); の違いがわかりません。どちらも$sriptをバックグラウンドで実行してくれますが、マニュアルに記載されているファイルポインタの指定とパイプのオープンがもたらす決定的な違いなどどのようなものになるのでしょうか? また、popen()使用後に、pclose() で閉じないでいるとどのようなことが起こるのでしょうか? たくさんありますが、ひとつでもお分かりになるかたおられましたらどうぞよろしくお願いいたします。

    • 締切済み
    • PHP