4

execvpを使ってプログラムを実行するプログラムを開発しています。子プロセスの結果を取得し、メイン プロセスで解析する必要があります。名前付きパイプを使用して複製する方法があるようです。私はこれの良い例を見つけようとしていますが、今のところうまくいきません。これに関するポインタ、リンク、および/または提案があれば、大いに感謝します。

4

3 に答える 3

7

名前付きパイプは必要ありません。名前のないパイプは問題なく機能します。実際、多くの場合、 / / /を自分popenで実行する代わりに、そのまま使用できます。 次のように動作します (ただし、実装にはより多くのエラー チェックが含まれている可能性があります)。pipeforkdupexecpopenlibc

FILE *popen(const char *command, const char *type) {
    int fds[2];
    const char *argv[4] = {"/bin/sh", "-c", command};
    pipe(fds);
    if (fork() == 0) {
        close(fds[0]);
        dup2(type[0] == 'r' ? 0 : 1, fds[1]);
        close(fds[1]);
        execvp(argv[0], argv);
        exit(-1);
    }
    close(fds[1]);
    return fdopen(fds[0], type);
}

これにより、名前のないパイプが作成され、forks. 子では、stdout (または stdin) をパイプの一方の端に再接続し、次にexecs を子にします。親は、パイプの反対側から単純に読み取り (または書き込み) できます。

于 2009-04-17T21:29:36.057 に答える
2

popen() しか使えないの?

于 2009-04-17T21:15:06.527 に答える
0

popen を使用して目標を達成する簡単な例を次に示します。コマンドとして「echo」よりも興味深いものを入力してください:)

#include <stdio.h>

int main() 
{
    char buf[100];
    int i = 0;
    FILE *p = popen("echo \"Test\"","r");
    if (p != NULL )
    {
        while (!feof(p) && (i < 99) )
        {
            fread(&buf[i++],1,1,p);
        }
        buf[i] = 0;
        printf("%s",buf);
        pclose(p);
        return 0;
    }
    else
    {
        return -1;
    }
}
于 2011-08-17T09:54:59.537 に答える