0
void execute_command_pipe(char * command_from, char * command_to, char ** args_from, char ** args_to) {
    pipe(pipefd);

    int pid = fork();
    close(pipefd[0]);
    if (pid == 0) {
        //close(STDOUT_FILENO);
        dup2(pipefd[1], STDOUT_FILENO);
        int rv1 = execv(get_contain_dir(command_from), args_from);
        close(pipefd[1]);
    } else {
        close(pipefd[1]);
        dup2(pipefd[0], STDIN_FILENO);
        int rv2 = execv(get_contain_dir(command_to), args_to);
        close(pipefd[0]);
    }
}

たとえば、 ls | と同等のことをしたい場合 grep テストでは、親スレッドは STDIN で入力をリッスンする grep を実行し、子スレッドは ls の出力を STDTOUT に書き込みます。

4

2 に答える 2

0

低レベルのパイプ/フォークを使用する必要がありますか? そうでない場合 - より簡単な方法 - popen/pclose システム コールを使用します。

あなたの例では ls | grep、これは次のとおりです。

FILE *f = popen("ls");
char buf[1000];
while(fgets(buf, sizeof(buf), f) 
  call_my_grep(buf);
pclose(f);

これは簡単で効率的です。

于 2013-10-30T03:22:05.257 に答える