こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

UNIX & Linux の標準出力で得たデータを、C言語のローカル変数に取り込むには?

c言語の関数を実行中に、UNIXにあるシェルコマンド"wc"の標準出力から得られるデータを、直接ローカル変数に入れたいと思います。

int hoge(void)
{
int ans;
ans = system("wc");
return
}
こんな感じにしたかったのですが、systemコマンドでは、戻り値を期待できずに居ます。

何か善い方法はありませんか?

投稿日時 - 2008-07-03 13:35:48

QNo.4148126

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

標準入力にだしながら、標準出力の結果を受け取るというのは
pipe(),fork()あたり使ったりして結構めんどくさいでしょうから、
どうしても、wcをコールしたいのなら、一旦、wcの標準入力にいれたいものをファイルに書いてから、popen ( "wc < ファイル" , "r");
すればいいのではないでしょうか。
ファイルの掃除とか、他のプロセスとファイルがぶつからないようにするとか考えないといけませんけど。

投稿日時 - 2008-07-03 16:55:51

補足

ありがとうございます。

戴いた案は、私も考えましたが、同じようにファイルの後処理とかを複数回行わなければならず、処理がぶつかりそうなので断念しました。

投稿日時 - 2008-07-03 23:02:50

ANo.3

オーバーヘッド考えたら、wc機能を行うCライブラリを使ったほうが速くないですか?

投稿日時 - 2008-07-03 16:47:03

補足

ご回答、ありがとうございます。

>wc機能を行うCライブラリを使ったほうが速くないですか?
それって、どの様なライブラリでしょうか?

投稿日時 - 2008-07-03 23:13:59

ANo.2

まず「コマンドラインでは、'$ wc filename | program' とすればprogramの引数として値が渡りますが」と書かれていますが, これは wc filename の標準出力を program の標準入力に渡すということであって, 「引数として渡す」ということではありません.
で本題ですが.... 「popenを使うと、書き込み用プロセスと読み込みようプロセスを立ち上げることになり、一見簡単そうで複雑なコードになりませんか?」というのは, ちょっと意味がわかりません. popen の仕様は確認しましたか?
popen を使えば, プログラムの標準入出力をあたかもファイルであるかのように扱うことができます (もちろん普通のファイルと違って入出力を同時に実行することはできませんが). だから, 「ファイルから読み込む」のとほぼ同等の複雑さで「プログラムの標準出力を読み込む」ことができます.

投稿日時 - 2008-07-03 16:36:30

補足

ご回答、ありがとうございます。

それって、こんな感じですよね。
#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);
}

投稿日時 - 2008-07-03 23:34:37

ANo.1

それは「wc の返り値」をもらってるだけで, 「wc の出力」をもらっているわけではありません.
UNIX&Linux 限定なら popen が簡単かな.

投稿日時 - 2008-07-03 13:45:43

補足

ご回答、有難うございます。

popenを使うと、書き込み用プロセスと読み込みようプロセスを立ち上げることになり、一見簡単そうで複雑なコードになりませんか?

私がこのコマンド("wc")を使おうと思ったのは、既にあるコマンド(機能)でCのライブラリ関数の中に組み込めるのでは?と思ったからです。
コマンドラインでは、'$ wc filename | program' とすればprogramの引数として値が渡りますが、実行中のプログラムで、且つ、一つの関数(サブルーチン)の中で実現したいと思います。しかも、出来るだけシンプルに。

投稿日時 - 2008-07-03 15:12:31

あなたにオススメの質問