에 파이프를 구현 :나는 C에서 파이프를 구현하려고하지만 약간의 문제가 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 명, cmd2
에 대한 cmd1
에 대한 다른 하나를 만듭니다. cmd1
의 출력은 cmd2
의 입력으로 재 지정됩니다. |
LS를 : 내 문제는
cmd2
이cmd1
전에 실행된다, 그래서 입력하면 wc
예를 들어 wc가 먼저 실행됩니다. 내 쉘에서 볼 수 있습니다.
C2
C1
C2 exe
C2를 실행하기 전에 C1을 완전히 실행하는 방법은 무엇입니까? 이전에, 나는 waitpid(c1,...,..);
으로 c2의 c1 아이를 만들려고했으나 같은 결과가있었습니다.