C管道到另一个程序的STDIN并执行

时间:2017-11-18 21:43:12

标签: c pipe fork

我不明白为什么execl-command中的程序没有从父进程获得输入:

我的代码:(我删除了错误处理和其他一些步骤,使其更简单)

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
     int pipefd[2];
     pipe(pipefd);
     pid_t pid = fork();
     switch(pid){
         case -1:
             exit(EXIT_FAILURE);
         case 0:
             close(pipefd[1]);
             dup2(pipefd[0], STDIN_FILENO);
             close(pipefd[0]);
             execl("/usr/bin/wc", "-w", NULL);
             fflush(stdout);
             exit(EXIT_SUCCESS);
         default:
             close(pipefd[0]);
             FILE *pipewrite = fdopen(pipefd[1], "w");
             char *ar[] = {"W1", "W2", "W3", "W4", "W5"};
             for(int i = 0; i < 5; i++){
                 fputs(ar[i], pipewrite);
                 fflush(pipewrite);
             }
             fflush(pipewrite);
             fclose(pipewrite);
     }
     exit(EXIT_SUCCESS);
}

如果我启动程序,输出应为5.

1 个答案:

答案 0 :(得分:1)

execl电话有问题。

execl("/usr/bin/wc", "-w", NULL);

需要:

execl("/usr/bin/wc", "wc", "-w", NULL);

即你需要将命令(wc)作为参数传递给execl

您将看到的下一个问题是wc没有5.这是因为您从父进程传递的所有stdin内容都被视为单个单词(由于缺少空格)。 基本上,如果你这样做:

   fputs(ar[i], stdout);
在父进程中,在stdout上看到的内容是子进程可以看到的内容。

以某种方式添加空格。例如,您可以再次致电fputs

   fputs(ar[i], pipewrite);
   fputs(" ", pipewrite);

或者,您可以在字符串中包含空格:

char *ar[] = {"W1 ", "W2 ", "W3 ", "W4 ", "W5"};