2012-05-25 45 views
0

当我用ls | head执行此函数时,在打印出文件和目录后,它挂在第二个子进程中。有人能告诉我我在这里想念什么吗?在此先感谢子进程挂在管道内

int unipipe(char* lhs[], char* rhs[]) 
{ 
    int pfd[2]; 
    int status, cid; 
    pid_t pid; 
    char buf; 
    if((lhs != NULL) && (rhs != NULL)) 
    { 
     if(pipe(pfd) != 0) 
     { 
     perror("pipe"); 
     return -1; 
     } 
    if((pid = fork()) < 0) 
    { 
     perror("fork"); 
     return -1; 
    } 
    else if(pid == 0) 
    { 
     close(1); //close the unused read end 
     dup2(pfd[1], STDOUT_FILENO); 
     //execute the left-hand side command 
     close(pfd[0]); 
     execvp(lhs[0], lhs); 
     _exit(EXIT_SUCCESS); 
    } 

    if(setpgid(pid, 0) < 0) 
    { 
    perror("setpgid"); 
    return -1; 
    }; 

    cid = waitpid(pid, &status, 0); 
    if((pid = fork()) == 0) 
    { 
     close(0); 
     dup2(pfd[0], STDIN_FILENO); 
     close(pfd[1]); //close the unused write end 
     execvp(rhs[0], rhs); 
     _exit(EXIT_SUCCESS); 
    } 
    else 
    { 
      waitpid(pid, &status, 0); 
    } 
} 
+1

函数unipipe在哪里适合你的'ls | head'?祝你好运。 – shellter

+0

我有一个函数调用解析器,它将命令“ls | head”解析为两个char指针数组:lhs将是{“ls”,null},rhs是{“head”,null}。感谢您的回复! – jctank

回答

1

您等待第一个进程退出,然后再开始第二个进程。每个管道都有一个缓冲区,一旦这个缓冲区满了,I/O功能就会被阻塞,等待从管道中读取几个字节,这样就可以有更多的“流入”。机会是你的第一个过程阻塞管道,因此永远不会退出。

我会声明两个类型为pid_t的变量,每个孩子一个,并且只有在两个变量都成功启动后才等待它们。

+0

太棒了!这有效,非常感谢! – jctank

0

让你的程序运行,删除第一个:

cid = waitpid(pid, &status, 0); 

在:

else 
{ 
     waitpid(pid, &status, 0); 
} 

你将其替换为:

wait(); // for the fist child 
wait(); // for the second child 

你的程序将运行。