- 締切済み
UNIX & Linux の標準出力で得たデータを、C言語のローカル変数に取り込むには?
c言語の関数を実行中に、UNIXにあるシェルコマンド"wc"の標準出力から得られるデータを、直接ローカル変数に入れたいと思います。 int hoge(void) { int ans; ans = system("wc"); return } こんな感じにしたかったのですが、systemコマンドでは、戻り値を期待できずに居ます。 何か善い方法はありませんか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- superside0
- ベストアンサー率64% (461/711)
標準入力にだしながら、標準出力の結果を受け取るというのは pipe(),fork()あたり使ったりして結構めんどくさいでしょうから、 どうしても、wcをコールしたいのなら、一旦、wcの標準入力にいれたいものをファイルに書いてから、popen ( "wc < ファイル" , "r"); すればいいのではないでしょうか。 ファイルの掃除とか、他のプロセスとファイルがぶつからないようにするとか考えないといけませんけど。
- superside0
- ベストアンサー率64% (461/711)
オーバーヘッド考えたら、wc機能を行うCライブラリを使ったほうが速くないですか?
補足
ご回答、ありがとうございます。 >wc機能を行うCライブラリを使ったほうが速くないですか? それって、どの様なライブラリでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
まず「コマンドラインでは、'$ wc filename | program' とすればprogramの引数として値が渡りますが」と書かれていますが, これは wc filename の標準出力を program の標準入力に渡すということであって, 「引数として渡す」ということではありません. で本題ですが.... 「popenを使うと、書き込み用プロセスと読み込みようプロセスを立ち上げることになり、一見簡単そうで複雑なコードになりませんか?」というのは, ちょっと意味がわかりません. popen の仕様は確認しましたか? popen を使えば, プログラムの標準入出力をあたかもファイルであるかのように扱うことができます (もちろん普通のファイルと違って入出力を同時に実行することはできませんが). だから, 「ファイルから読み込む」のとほぼ同等の複雑さで「プログラムの標準出力を読み込む」ことができます.
補足
ご回答、ありがとうございます。 それって、こんな感じですよね。 #include <stdio.h> char *wc = "wc file"; main() { FILE *inpipe, *popen(); char buf[BUFSIZ]; inpipe = popen(wc, "r"); while (fgets(buf, sizeof buf, inpipe) != NULL) { buf[strlen(buf)-1] = ' '; fputs(buf, stdout); } printf("\n"); pclose( inpipe ); exit(0); }
- Tacosan
- ベストアンサー率23% (3656/15482)
それは「wc の返り値」をもらってるだけで, 「wc の出力」をもらっているわけではありません. UNIX&Linux 限定なら popen が簡単かな.
補足
ご回答、有難うございます。 popenを使うと、書き込み用プロセスと読み込みようプロセスを立ち上げることになり、一見簡単そうで複雑なコードになりませんか? 私がこのコマンド("wc")を使おうと思ったのは、既にあるコマンド(機能)でCのライブラリ関数の中に組み込めるのでは?と思ったからです。 コマンドラインでは、'$ wc filename | program' とすればprogramの引数として値が渡りますが、実行中のプログラムで、且つ、一つの関数(サブルーチン)の中で実現したいと思います。しかも、出来るだけシンプルに。
補足
ありがとうございます。 戴いた案は、私も考えましたが、同じようにファイルの後処理とかを複数回行わなければならず、処理がぶつかりそうなので断念しました。