首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个关于pipe的小疑点

2013-11-14 
一个关于pipe的小问题本帖最后由 wanren13 于 2013-11-12 19:56:19 编辑如果在一个程序里pipe分别让子进程

一个关于pipe的小问题
本帖最后由 wanren13 于 2013-11-12 19:56:19 编辑 如果在一个程序里pipe分别让子进程和父进程写读,父进程需要使用wait()函数吗?

例如:


int fd[2];
pipe[fd];

pid_t pid = fork();

if(pid == 0){
close(fd[0]);
write(fd[1], "Hello", 5);
}

else if(pid > 0){
wait(NULL); //这里需要用wait吗?
char buf[BUFSIZ];
close(fd[1]);
read(fd[0], buf, BUFSIZ);
}


个人感觉,如果用了read,进程就会被阻挡,直到子进程的write结束,所以不用wait子进程。 但是我不是很确定,不知道这里有没有其他的例外?

请版里的大侠指点一二,小弟不胜感激。 c pipe linux 进程
[解决办法]
没有例外哈,read循环读到0为止,再进入wait回收一下资源就可以了。
[解决办法]
嗯,需要的,不过不是在那个位置,而是在read之后的。
[解决办法]
read函数默认是会阻塞,因此只要有内容写入我觉得可以读到内容的,wait的作用是阻塞等待某个子进程退出后做清理工作的,LZ不用调wait来让子进程退出后再让read函数读管道中的内容。
另外pipe是个函数,调用的时候用pipe(fd);
[解决办法]
引用:
如果在一个程序里pipe分别让子进程和父进程写读,父进程需要使用wait()函数吗?

例如:

int fd[2];
pipe[fd];

pid_t pid = fork();

if(pid == 0){
close(fd[0]);
write(fd[1], "Hello", 5);
}

else if(pid > 0){
wait(NULL); //这里需要用wait吗?
char buf[BUFSIZ];
close(fd[1]);
read(fd[0], buf, BUFSIZ);
}


个人感觉,如果用了read,进程就会被阻挡,直到子进程的write结束,所以不用wait子进程。 但是我不是很确定,不知道这里有没有其他的例外?

请版里的大侠指点一二,小弟不胜感激。

可以放心的,可以不加wait(NULL);
read会阻塞直到写完的。

热点排行