3

Linux CLI コマンドを実行し、C から stdout 出力を取得する必要があります。

pipe() を使用してパイプを作成し、次に fork/exec を使用して、exec() を呼び出す前に子の stdout 記述子をパイプにリダイレクトし、親のパイプから読み取ることができます。さらに、私は子供を待つ必要があります。

system() が fork + exec + 待機を行うように、fork + リダイレクト + exec + 待機を行うための単純な呼び出しはありますか? system() のみがリダイレクトを行いません。

fork + redirect + exec を行う popen() がありますが、待機は行わないため、終了ステータスを取得できません。

4

4 に答える 4

6

これでしょうか?

名前
       popen、pclose - プロセス I/O

あらすじ
       #include <stdio.h>  

       FILE *popen(const char *command, const char *type);

       int pclose(FILE *ストリーム);

説明
       popen() 関数は、パイプを作成し、フォークし、
そしてシェルを呼び出します。パイプは定義上単方向であるため、
type 引数は、両方ではなく、読み取りまたは書き込みのみを指定できます。結果として
したがって、ストリームは読み取り専用または書き込み専用です。

       コマンド引数はヌル終了文字列へのポインタです
シェルコマンドラインを含みます。このコマンドは /bin/sh に渡されます
-c フラグの使用。解釈があれば、シェルによって実行されます。  
型引数は、NULL で終わる文字列へのポインターである必要があります。
読み取り用の 'r' または書き込み用の 'w' のいずれか。

       popen() からの戻り値は、通常の標準 I/O ストリームです。
すべての点で、fclose() ではなく pclose() で閉じる必要があります。  
このようなストリームに書き込むと、コマンドの標準入力に書き込まれます。の
コマンドの標準出力は、呼び出したプロセスの標準出力と同じです
これがコマンド自体によって変更されない限り、popen()。逆に読むと
''popened'' ストリームからコマンドの標準出力を読み取り、
コマンドの標準入力は、呼び出したプロセスの標準入力と同じです
popen()。

       出力 popen() ストリームはデフォルトで完全にバッファリングされることに注意してください。

       pclose() 関数は、関連付けられたプロセスが終了するのを待ちます
そして、wait4() によって返されるコマンドの終了ステータスを返します。
于 2008-10-20T16:59:42.117 に答える
3

GLib にはこれに適した機能があります -- g_spawn_sync(): http://library.gnome.org/devel/glib/stable/glib-Spawning-Processes.html#g-spawn-sync

たとえば、コマンドを実行して終了ステータスと出力を取得するには、次のようにします。

const char *argv[] = { "your_command", NULL };
char *output = NULL; // will contain command output
GError *error = NULL;
int exit_status = 0;
if (!g_spawn_sync(NULL, argv, NULL, 0, NULL, NULL, 
                  &output, NULL, &exit_status, &error))
{
  // handle error here
}
于 2010-07-01T08:56:25.253 に答える
1

これが私が使用するものです:

   /* simply invoke a app, pipe output*/
    pipe = popen(buf, "r" );
    if (pipe == NULL ) {
        printf("invoking %s failed: %s\n", buf, strerror(errno));
        return 1;
    }

    waitfor(10);

    while(!feof(pipe) ) {
        if( fgets( buf, 128, pipe ) != NULL ) {
            printf("%s\n", buf );
        }
    }

    /* Close pipe */
    rc = pclose(pipe);
于 2008-10-20T20:09:28.770 に答える
1

とを使用popen()pclose()ます。


popen()もちろん、実際には待機しませんが、パイプの読み取りは、データが利用可能になるまでブロックされます。

pclose()待機しますが、時期尚早に呼び出すと、フォークされたプロセスからの出力が一部中断される可能性があります。子がいつ終了するかをストリームから判断する必要があります...


おそらくすでに議論されているC から外部プログラムを実行し、その出力を解析するにはどうすればよいですか?

于 2008-10-20T16:58:15.803 に答える