은 안녕하세요 저는 파이프C 여러 파이프 파이프 및 문제
나는 이미 작업 플렉스 프로그램이 그래서 프로그램 같은 쉘을 개발해야과 표현의 사용을 잃은 비트에 공급되는거야 이 기능
편집
내가 함수 내에서 파이프를 선언 않았다하지만 난 여전히 여기에 같은 문제 가 데이브 에 의해 지적내가 잠시 이미에 붙어되는 한 기능에 대한 업데이트입니다 예쁘게 파이프를 닫지 않는 것 같아. 두 번째 포크는 항상 waitpid를()
에 걸려있다하지만 난 주 과정의 모든 포크와 모든 차일을 닫으려고 않았다하지만 두 번째 포크는 여전히
int execute(Expression *e , int wait, int fdin,int fdout,int fderror){
int status;
pid_t childPID;
int fd;
int pp[2];
switch (e->type) {
case SIMPLE:
childPID = fork();
if(childPID >= 0) //fork was successful
{
if(childPID == 0) //child process
{
if(fdin != 0){
dup2(fdin,0);
close(fdin);
if(fdin > 2){
close(fdin +1);
}
}
if(fdout != 0){
dup2(fdout,1);
close(fdout);
if(fdout > 3){
close(fdout -1);
}
}
if(fderror != 2){
dup2(fderror,2);
close(fderror);
}
status = execvp(e->arguments[0], &e->arguments[0]);
perror(e->arguments[0]);
exit(1);
}
else//parent process
{
if(fdin > 2){
close(fdin);
close(fdin +1);
}
if(fdout > 3){
close(fdout);
close(fdout -1);
}
if(wait == 1){
printf("%s\n","going to wait");
waitpid(childPID, &status, 0);
}
putchar('\n');
break;
}
}
else// fork failed
{
perror("fork");
}
break;
case SEQUENCE:
execute(e->gauche,1,fdin,fdout,fderror);
execute(e->droite,1,fdin,fdout,fderror);
break;
case SEQUENCE_ET:
execute(e->gauche,0,fdin,fdout,fderror);
execute(e->droite,1,fdin,fdout,fderror);
break;
case SEQUENCE_OU:
execute(e->gauche,0,fdin,fdout,fderror);
execute(e->droite,1,fdin,fdout,fderror);
break;
case BG:
execute(e->gauche,0,fdin,fdout,fderror);
break;
case PIPE:
if(pipe(pp) < 0){
perror("pipe");
exit(1);
}
execute(e->gauche,0,fdin,pp[1],fderror);
execute(e->droite,1,pp[0],fdout,fderror);
break;
case REDIRECTION_I:
fd = open(e->arguments[0],O_RDONLY, 0666);
execute(e->gauche,1,fd,fdout,fderror);
break;
case REDIRECTION_O:
fd = open(e->arguments[0],O_CREAT | O_RDWR, 0666);
execute(e->gauche,1,fdin,fd,fderror);
break;
case REDIRECTION_A:
fd = open(e->arguments[0], O_TRUNC | O_CREAT | O_RDWR, 0666);
execute(e->gauche,1,fdin,fd,fderror);
break;
case REDIRECTION_E:
fd = open(e->arguments[0], O_CREAT | O_RDWR, 0666);
execute(e->gauche,1,fdin,fdout,fd);
break;
case REDIRECTION_EO:
fd = open(e->arguments[0], O_CREAT | O_RDWR, 0666);
execute(e->gauche,1,fdin,fd,fd);
break;
default:
return 0;
break;
}
return 0;
}
내 문제를 걸려이 잘 작동됩니다
ls | grep a
OS 같은 간단한 때 명령에 대한
ls > test
하지만3210 난 혼란은 그
ls | grep a > test
내가 터미널이 아닌 파일에 넣어 출력을 얻을 완전한 잘못된
exemple 간다까지의 경우
또는 내가
ls | grep a | grep c
를 사용하는 경우
파이프가 엉망으로 간다. 나는 더 많은 파이프가 필요하다고 생각하지만, 파이프를 만드는 방법을 모른다.
개덕분에 모든
편집
은 파이프의 수정 후 내가 대신 파일 에 내가 고양이를했던 LS의 exemple를 위해 더 큰 데이터 로 명령을 시도 않았다고 생각하는 모든 데이터가 파이프에 도착하기 전에 명령이 멈춘 것처럼 보입니다.
어디에서 pp가 정의 되었습니까? 배관을하고있는 것이지만 우리에게 정의를주지는 않았습니다. – dave
pp는 단지 ** int pp [2] ** 뒤에 ** pipe (pp) ** –