프로세스를 포크하고 명령을 실행하려고합니다. 명명 된 파이프를 만들고 파이프에 STDOUT을 쓰는 하위 프로세스에서 명령을 실행하려고합니다. 상위 프로세스가 파이프에서 읽습니다. 내 문제는 부모 프로세스가 파이프에서 데이터를 완전히 읽지 못한다는 것입니다. 여기 코드가 있습니다.부모 프로세스가 명명 된 파이프에서 데이터를 완전히 읽지 않습니다.
fifo_fd = mkfifo(MY_FIFO, 0666);
FILE *fp = fdopen(fifo_fd, "r");
childpid = fork();
if (childpid == 0)
{
dup2(fifo_fd, STDOUT_FILENO);
dup2(fifo_fd, STDERR_FILENO);
close(fifo_fd);
execv(arg_list[0], arg_list);
_exit (127);
}
else
{
//parent process
if(waitpid(childpid, &status,WNOHANG) == -1) {
// now we kill the child and return failure.
}
fcntl(fd, F_SETFL, O_NONBLOCK);
while((fgets(buf, sizeof(buf)-1,fp))) {
strcat(result,buf); //we copy the buf to result
}
return success;
}
글쎄, 당신은 당신의 독서에 심각한 결함이 있습니다. 당신은 실제로 읽기를 시작하기 전에 아이가 죽기를 기다리고 있습니다. 즉, 시스템이 제공하는 버퍼에 완전히 들어갈 수있는 것에 의존하고 있음을 의미합니다. 그 이상으로 교착 상태가 발생합니다. 이것이 당신이보고있는 증상을 유발할 수 있는지 여부는 내가 말할 수없는 것입니다. –
@ChristianStieber : WNOHANG 옵션은 waitpid가 제대로 작동하는지 확인합니다. 내가 부모 프로세스에서 파이프에서 읽을 수 있지만 그것을 완전히 dosent 읽기() nocks()와 같은 함수를 읽을 때() 복귀 반환 차단 – prabhu