我尝试在C中实现一个管道,但是我有一点问题:
这是我的功能:
void commandeTube(char * c1, char * c2) {
int c1toc2[2];
int c2toPere[2];
pid_t pidc1, pidc2;
if(pipe(c1toc2) && pipe(c2toPere)) {
perror("Erreur");
errno=0;
return ;
}
pidc2 = fork();
if(pidc2 != 0) {
pidc1=fork();
if(pidc1!=0) {
int status;
waitpid(pidc1,&status,0);
char buffer[1024]={0};
int n;
while((n=read(c2toPere[0],buffer,1024))==1024)
write(1,buffer,n);
write(1,buffer,n);
}
else if(pidc1==0){
write(STDOUT_FILENO,"C1\n",3);
/*On est dans C1*/
close(c1toc2[0]);
dup2(c1toc2[1],1);
char * argc1[10];
constructTab(c1,argc1);
write(STDOUT_FILENO,"C1 exe\n",7);
if(execvp(argc1[0],argc1)==-1) {
perror("Erreur execlp");
errno=0;
return;
}
freeTab(argc1);
write(STDOUT_FILENO,"C1 fin\n",7);
}
}
else {
/*C2*/
write(STDOUT_FILENO,"C2\n",3);
int stat;
char * argc2[10];
constructTab(c2,argc2);
close(c1toc2[1]);
/*close(c2toPere[0]);*/
dup2(c1toc2[0],STDIN_FILENO);
/*dup2(c2toPere[1],1);*/
write(STDOUT_FILENO,"C2 exe\n",7);
if(execvp(argc2[0],argc2)==-1) {
perror("Erreur execlp");
errno=0;
return;
}
freeTab(argc2);
write(STDOUT_FILENO,"C2 fin\n",7);
}
}
例如,如果我有这个:
cmd1 | CMD2
主要流程会创建2个子级,一个用于cmd1
,另一个用于cmd2
。 cmd1
的输出被重定向到cmd2
的输入。我的问题是cmd2
在cmd1
之前执行,所以如果我输入:
例如,wc将首先启动。这就是我在我的shell中看到的:ls | WC
C2
C1
C2 exe
如何在执行C2之前完全执行C1?之前,我试图用waitpid(c1,...,..);
制作c2的c1孩子,但结果相同。
答案 0 :(得分:0)
如果您希望将第一个命令的输出重定向到第二个命令的输入,您可以考虑阅读man 2 pipe
,那里有一个很好的例子可以让您走上正轨。
答案 1 :(得分:0)
您的代码适用于我,但C1 exe消息被重定向到管道。我将所有STDOUT_FILENO
更改为STDERR_FILENO
,然后我看到了
C2
C1
C1 exe
C2 exe
193 194 1502
与ls wc一起运行。