2012-02-05 67 views
1

我想管在C并行地,但由于某种原因,它不是关闭...它只是在等待....不知道如果我所描述的这口井因为我是新的在这一点,但这里的代码平行管道不在C中关闭?

... some code up here 
if(child_pid == 0) { 

    if(p0 >=0 && p1 == -1) { 
     dup2(p0, STDIN_FILENO); 
     close(p0); 
     close(p1); 
    } 
    else if (p0 == -1 && p1 >= 0) { 
     dup2(p1, STDOUT_FILENO); 
     close(p0); 
     close(p1); 
    } 
    else if (p0 >= 0 && p1 >=0) { 
     dup2(p0, STDIN_FILENO); 
     dup2(p1, STDOUT_FILENO); 
     close(p0); 
     close(p1); 
    } 

     if (input) 
     iofunc(input, 0); 
     if (output) 
     iofunc(output, 1); 
    if (sub){ 
     command_exec (SUBSHELL_COMMAND, sub, -1, -1, -1); 
     exit(0); 
    } 
    else { 
     execvp(w[0], w); 
     exit(0); 
    } 
} 
else { 
    if (waitpid (-1, &child_status, 0) != child_pid) 
     child_status =-1; 
    close(p0); 
      close(p1); 
    return WEXITSTATUS(child_status); 
} 
    ... some code down here 

当P0 == -1 & & P1> = 0,则处理退出/返回,但由于某种原因,当P0> = 0 & & P1 == -1,处理只是挂起和管道不关闭。我运行了一个命令ls |猫使用两个并行的子进程,ls写入p1,猫读取p0。输出是正确的,但管道没有关闭,猫从不退出。到底是怎么回事?

@William我想在我的父母else块以下的,但它并没有在这里工作

close(p0); 
close(p1); 
if (waitpid (-1, &child_status, 0) != child_pid) 
    child_status =-1; 

@William是调用,调用上面的代码

int i = 0; 
    int num = 2; 
    int status; 
    pid_t pid; 
    pid_t pids[num]; 
    int fd[2]; 
    int p = pipe(fd); 
    int a; 
    int b; 
    //printf("pipe0:%d\n", fd[0]); 
    //printf("pipe1:%d\n", fd[1]); 

    for (i = 0; i < num; i++) { 
     if ((pids[i] = fork()) < 0) { 
     error(1,0, "child not forked"); 
     } else if (pids[i] == 0) { 
     if (i == 0){ 
      b = command_exec (c->type, 
       c->u.command[1], 
       0, f[0], p1); 
     } 
     else if (i == 1){ 
      a = command_exec (c->type, 
       c->u.command[0], 
       1, p0, fd[1]); 
     } 
     exit(a && b); 
     } 

    } 

    while (num > 0) { 
     pid = wait(&status); 
     printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status); 
     num--; 


    } 
一个函数的代码

的printf的只打印子进程结束LS但不是猫

+0

您需要出示包括管道()调用和fork()调用的代码。只要所有写入端的文件描述符与猫的标准输入相关的管道关闭,猫就会终止。你所描述的问题几乎肯定是关闭文件描述符的失败。可能猫的调用本身仍然是开放的。 – 2012-02-05 03:34:49

+0

当你叉,家长有管开放的两端。除非在某些时候你分配P1 = FD [1],父母永远不会关闭FD [1]。因为cat正在等待更多的数据,所以Cat不会终止,直到父节点关闭该文件描述符。 – 2012-02-05 16:39:26

回答

1

最有可能的,家长是抱着开放管道的另一端。 ls在cat的管道写入端有一个打开的文件描述符,但父类也是如此。直到所有写入端文件描述符都关闭后,cat才会退出。也许,只需要在调用waitpid而不是之后调用代码并关闭管道。