当前位置: 技术问答>linux和unix
管道和父子进程的问题
来源: 互联网 发布时间:2016-06-04
本文导语: #include #include #include int main(){ pid_t pid; int fd[2]; pipe(fd); pid = fork(); if(pid==0){ dup2(fd[1],STDOUT_FILENO); exec...
#include
#include
#include
int main(){
pid_t pid;
int fd[2];
pipe(fd);
pid = fork();
if(pid==0){
dup2(fd[1],STDOUT_FILENO);
execlp("ls","ls","-l",NULL);
}
waitpid(pid,NULL,0);
pid = fork();
if(pid==0){
dup2(fd[0],STDIN_FILENO);
execlp("grep","grep","Inifok",NULL);
}
waitpid(pid,NULL,0); //父进程阻塞在这里
printf("donen");
}
我想实现shell下面的管道功能,第一个子进程做ls命令,然后第二个子进程做grep命令,
但是第二个子进程没有结束,请问是为什么?难道是管道里面没有文件结束符吗?
如果我想实现多重管道,比如说 ls | grep Inifok | wc
程序应该如何写?谢谢了。。。
#include
#include
int main(){
pid_t pid;
int fd[2];
pipe(fd);
pid = fork();
if(pid==0){
dup2(fd[1],STDOUT_FILENO);
execlp("ls","ls","-l",NULL);
}
waitpid(pid,NULL,0);
pid = fork();
if(pid==0){
dup2(fd[0],STDIN_FILENO);
execlp("grep","grep","Inifok",NULL);
}
waitpid(pid,NULL,0); //父进程阻塞在这里
printf("donen");
}
我想实现shell下面的管道功能,第一个子进程做ls命令,然后第二个子进程做grep命令,
但是第二个子进程没有结束,请问是为什么?难道是管道里面没有文件结束符吗?
如果我想实现多重管道,比如说 ls | grep Inifok | wc
程序应该如何写?谢谢了。。。
|
#include
#include
#include
int main()
{
pid_t pid;
int fd[2];
pipe(fd);
pid = fork();
if(pid==0){
dup2(fd[1],STDOUT_FILENO);
close(fd[0]);
execlp("ls","ls","-l",NULL);
}
close(fd[1]); //要把父进程的管道关掉
waitpid(pid,NULL,0);
pid = fork();
if(pid==0){
dup2(fd[0],STDIN_FILENO);
close(fd[1]);
execlp("grep","grep","c",NULL);
}
close(fd[0]); //关掉
waitpid(pid,NULL,0); //父进程阻塞在这里
printf("donen");
}
如果父进程的管道不关掉,子进程读管道的时候会阻塞;如果管道写端全部被关掉了,read才会返回0
#include
#include
int main()
{
pid_t pid;
int fd[2];
pipe(fd);
pid = fork();
if(pid==0){
dup2(fd[1],STDOUT_FILENO);
close(fd[0]);
execlp("ls","ls","-l",NULL);
}
close(fd[1]); //要把父进程的管道关掉
waitpid(pid,NULL,0);
pid = fork();
if(pid==0){
dup2(fd[0],STDIN_FILENO);
close(fd[1]);
execlp("grep","grep","c",NULL);
}
close(fd[0]); //关掉
waitpid(pid,NULL,0); //父进程阻塞在这里
printf("donen");
}
如果父进程的管道不关掉,子进程读管道的时候会阻塞;如果管道写端全部被关掉了,read才会返回0
|
2楼是对的!再加点解释性文字:
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于
读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如
果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,
如close、read、write等等。
从管道中读取数据:
* 如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0;
* 当管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节
数目不大于PIPE_BUF,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求
的字节数(此时,管道中数据量不小于请求的数据量)。
注:(PIPE_BUF在 include/linux/limits.h中定义,不同的内核版本可能会有所不同。Posix.1要求PIPE_BUF至
少为512字节,red hat 7.2中为4096)。
摘自这里:http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于
读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如
果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,
如close、read、write等等。
从管道中读取数据:
* 如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0;
* 当管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节
数目不大于PIPE_BUF,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求
的字节数(此时,管道中数据量不小于请求的数据量)。
注:(PIPE_BUF在 include/linux/limits.h中定义,不同的内核版本可能会有所不同。Posix.1要求PIPE_BUF至
少为512字节,red hat 7.2中为4096)。
摘自这里:http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/