• ベストアンサー

popen関数について

C言語にお詳しい方、ご回答お願いします。 popen関数の具体的な使用法(プログラム)と解説をお願いいたします。いろいろなサイトで探したのですが、なかなかわかりやすい解説がなく、「他のアプリケーションにパイプをつなぐ」ということぐらいしかわかりませんでした。 よろしくお願いします。

noname#48747
noname#48747

質問者が選んだベストアンサー

  • ベストアンサー
noname#119918
noname#119918
回答No.2

ごく簡単な例ですが、コマンドを実行し、その結果を読み出すプログラムです。 sakusaker7さんも書いておられますが、何をしたいのか書いた方が 適切なアドバイスを受けられると思います。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE* p = popen("netstat" , "r"); char buf[80]; if(p == NULL) // popen失敗検知 { perror("popen"); exit(EXIT_FAILURE); } while((fgets(buf , 80 , p)) != NULL) // 実行結果読み出し { printf("%s" , buf); } pclose(p); return 0; }

noname#48747
質問者

お礼

お礼が遅くなってしまってすいません。 おかげさまで理解が深まりました。 ありがとうございました。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

探して見つからなかったということですけど、 popenとpclose http://www.fireproject.jp/feature/c-language/pipe/open-close.html ここにあるような説明でもわかりませんか? あと >「他のアプリケーションにパイプをつなぐ」ということぐらいしかわかりませんでした。 こういう状態で、そもそもなんでpopenを使おうとしているのかが疑問です。 具体的に何をやりたいのですか?

noname#48747
質問者

お礼

お礼が遅くなってしまってすいません。 おかげさまで理解が深まりました。 ありがとうございました。

関連する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 について

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

    • 締切済み
    • PHP
  • 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 ) ; }

  • C言語でプロセスを処理するプログラムを考えています。

    C言語でプロセスを処理するプログラムを考えています。 popenを使ってプロセスを起動しようとしたですが、popenが未定義の関数とエラーが出てコンパイルできません。 ヘッダにstdio.hはおいてあります。 コンパイラはborlandを使用しています。 よろしくお願いします。

  • MacでC言語を使いアプリケーションを作っています。

    前の質問でおかしな質問をしてしまったのでここで改めて質問します。 今、MacでWindowsのアプリケーションをつくろうとしています。しかし、Windows固有の関数をMacではどのように記述すればよいかが分からないので全然進みません。MacでC言語を解説しているページは少なく、Windows関数はMacでどうするのかといった解説はもちろんありません。Macにしようとしているアプリケーションはパワポケのパスメってやつで、プログラムの言語はC++言語です。 http://f1.aaa.livedoor.jp/~pasume/pass/pasume.htm 上のサイトの『PM_GB1 Ver1.0』というアプリケーションです

  • IFS関数とIF関数について

    エクセルのIFS関数とIF関数を使用しています。  A1   B1  C1 パイプ 3500  9.5 A1にパイプと選択すると、B1に3500、C1に9.5と出るようにIFS関数を入力しております。(パイプのほかにもあるのでIFS関数を使用) 質問ですが、 A1にパイプを選択した場合、B1に4000となり、C1に10と表示させたい場合もあるので、AND関数やOR関数を使用すればできるのでしょうか? A1   B1  C1 パイプ 4000  10 説明が不足かもしれませんが、その場合補足いたします。 よろしくお願いいたします。

  • sleep()関数について

    "数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと 考えています。 プログラム実行環境はWindowsですが、 sleep()関数は使用できないのでしょうか?? 仮に使用できない場合、この関数に代わる関数や代替方法が あれば教えて頂けませんでしょうか? 宜しくお願いします。

  • C言語 関数の呼び出し関係について

    C言語を習い始めてから、1ヶ月も経っていないんですが、長いプログラム(1万行くらい)の読解という課題が出ました。 読解を円滑に進めていくためのコツとして、「関数の大まかな呼び出し関係」を調べればよい、と学びました。 そこで質問させてもらいたいのですが、「関数の呼び出し関係を調べる」とは、具体的にどういうことなんでしょうか?関数が関数を呼び出しているんですか?? もうひとつC言語について質問です。 今回与えられたプログラムは1万行くらいあるのですが、そのうちmain関数は50行くらいしかありません。 これって、残り9950行はすべて、main関数の動作のためにあるんですか?? 以上、初歩的な質問かもしれませんが、ご指導願います。

  • split関数について・・・

    split関数について・・・ split関数を使いたいのですが、 どうかいていいかわかりません Perl言語を使用してます、 どなたか、回答おねがいします 試してみましたが、プログラムが終了して しまいます、ボットで使おうと思ってるのですが

    • ベストアンサー
    • Perl
  • sambaのsmbmount使用時のパスワード自動入力方法

    c言語でsambaのsmbmountを使用し、各クライアントの共有フォルダをmountし、linuxからでも閲覧するようなプログラムを作成しています。 現在、system()関数を使用し、smbmountまでは動作確認しているのですが、smbmount後のpasswordの自動入力のプログラム記述が分からない状況です。 popenやfopenなどの関数を使用してみましたが、問題は解消できませんでした。 すみませんが、ご教授よろしくお願いいたします。

専門家に質問してみよう