我不明白为什么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.
答案 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"};