2012-09-10 3 views
1

프로세스를 포크하고 명령을 실행하려고합니다. 명명 된 파이프를 만들고 파이프에 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; 
} 
+0

글쎄, 당신은 당신의 독서에 심각한 결함이 있습니다. 당신은 실제로 읽기를 시작하기 전에 아이가 죽기를 기다리고 있습니다. 즉, 시스템이 제공하는 버퍼에 완전히 들어갈 수있는 것에 의존하고 있음을 의미합니다. 그 이상으로 교착 상태가 발생합니다. 이것이 당신이보고있는 증상을 유발할 수 있는지 여부는 내가 말할 수없는 것입니다. –

+0

@ChristianStieber : WNOHANG 옵션은 waitpid가 제대로 작동하는지 확인합니다. 내가 부모 프로세스에서 파이프에서 읽을 수 있지만 그것을 완전히 dosent 읽기() nocks()와 같은 함수를 읽을 때() 복귀 반환 차단 – prabhu

답변

0

파일 시스템 항목을 만들 필요가없는 방식으로, FIFO가 아닌 파이프를 사용하고자합니다. @Christian에 따르면, 두 프로세스가 동시에 실행되도록해야합니다. 그렇지 않으면 pipe/fifo가 차단되어 프로그램이 중단 될 수 있습니다.

다음과 같이 시도해보십시오.

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 

int main() { 
    int pipe_fd[2]; 
    pipe(pipe_fd); 

    if (fork() == 0) { 
     dup2(pipe_fd[1], STDOUT_FILENO); 
     dup2(pipe_fd[1], STDERR_FILENO); 
     close(pipe_fd[0]); 
     close(pipe_fd[1]); 
     char *arg_list[] = {"/bin/echo", "hello", 0}; 
     execv(arg_list[0], arg_list); 
     __builtin_unreachable(); 

    } else { 
     close(pipe_fd[1]); 
     char buf[32]; 
     int count; 
     for (;;) { 
      count = read(pipe_fd[0], buf, sizeof(buf)); 
      if (count <= 0) break; 
      write(STDOUT_FILENO, buf, count); 
     } 
    } 

    return 0; 
} 
+0

않습니다; 해고? – prabhu

+0

예, 'alarm'은 신호를 보내므로 'read'는 'EINTR'을 반환합니다. – jleahy

+0

SIGALRM이 전송되면 프로그램이 올바르게 종료됩니까? EINTR로 읽기가 끝나면 어떻게 처리할까요? – prabhu

관련 문제