저는 부모와 자녀가 만든 C 프로그램을 작성하고 있습니다 (포크 사용). 그들은 파이프를 통해 통신합니다. 부모는 표준 출력을 통해 파이프에 쓰고 자식은 표준 입력을 통해 파이프에서 읽습니다. 일단 연결되면 parent는 파이프에 "hello world"를 쓰고 son은 exec를 호출합니다. 내 코드는 다음과 같습니다.
int main(int argc, char *argv[])
{
int p, a;
char buf[1024];
FILE *file;
size_t nread;
int fd[2];
char argument[PATH_MAX];
if(pipe(fd)<0){
return 1;
}
p = fork();
switch(p){
case -1: perror("Error en el fork()"); return 1;
case 0:
close(fd[1]);
close (0);
dup(fd[0]);
close(fd[0]);
sprintf(argument,"/usr/bin/%s",argv[1]);
execvp(argument,argv);
perror("Error en el execv");
exit(1);
default: break;
}
close(fd[0]);
close(1);
a = dup(fd[1]);
close(fd[1]);
write(1,"Hello World\n",12);
close(a);
wait(NULL);
return 0;
}
아들에 의해 실행 된 exec 함수는 함수 rev 또는 wc를 호출합니다. 인수없이 호출하면 rev 및 wc가 표준 입력 (제 경우에는 "hello world")에 적용되어야합니다. 그러나 이것은 작동하지 않으며 이유를 모르겠습니다. 어떤 도움이라도 정말 감사하겠습니다.
이것은 작동하지 않으며 이유를 모르겠습니다.
당신이 사용하고 있기 때문에 dup()
. 자식 프로세스의 표준 입력을 파이프로 리디렉션하려면 올바른 시스템 호출을 사용해야합니다.dup2()
case 0:
close( fd[1] );
dup2( fd[0], 0 ); // this "dup"s the read-end of the pipe onto STDIN
close( fd[0] );
dup()
부모 코드 브랜치 에서는 호출 이 전혀 필요하지 않습니다 . 파이프의 쓰기 끝에 쓰기 만하면됩니다.
write( fd[1], "Hello World\n", 12 );
그러나 부모 브랜치에서도 execvp를 사용하여 리디렉션 된 표준 출력으로 다른 프로그램을 시작하려면 dup2()
여기에서도 사용해야 합니다.
dup2( fd[1], 1 ); // this "dup"s the write-end of the pipe onto STDOUT
close( fd[1] );
자세한 내용은 맨 페이지 를 dup2
참조하십시오.
또한 코드의 또 다른 문제 argv
는 인수 목록으로 execvp를 사용하는 것입니다 . 이렇게하면 프로그램 이 상위 프로그램의 전체 명령 줄을 좋아 rev
하고 wc
수신하므로 표준 입력에서 읽는 대신 처리 할 인수를 찾습니다. 당신은 아마 원합니다
execvp( argv[1], &argv[1] );
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다