当前位置: 技术问答>linux和unix
管道通信中的一个问题
来源: 互联网 发布时间:2016-08-25
本文导语: 最近在学Linux下的通信机制,正好看到管道通信机制,先上网上的一段代码: if(pipe(pipe_fd)0) //父进程写 { close(pipe_fd[READ]); strcpy(w_buf,"hello world!n"); ...
最近在学Linux下的通信机制,正好看到管道通信机制,先上网上的一段代码:
在上面的代码中,当父进程向管道里写数据时,先关闭管道的读端,当子进程向管道里读数据时,关闭管道的写端,问题时,比如父进程在写完时,关闭写端时,好像没有唤醒子进程哦,即读端刚才被关闭了,子进程一直在等待,现在父进程关闭了写端,却没有打开读端,那么子进程岂不是一直等待下去??同理,如果在fork之后,子进程先被调度运行,那么在父进程写之前,子进程就已经关闭了写端,那么管道里根本就没有数据呀???
还有上面的代码中,在子进程读的那段代码里,sleep()语句是不是应该放在第一句,这样才能保证让父进程先做啊?
关于上面的close,其实我是这样认为的,如果是关闭写端,就在关闭之前,先看看有没有进程在读端等待,如果有的话,就“打开”读端,唤醒等待的进程。。。如果关闭读端,就看看有没有进程在等待写,有则唤醒.....不知道这样理解的对不对.....很想看看 管道通信里的close()函数的实现,但不知道在哪里查询,各位知不知道有什么linux 下的api(能够提供具体实现的)??
谢谢各位了....
if(pipe(pipe_fd)0) //父进程写
{
close(pipe_fd[READ]);
strcpy(w_buf,"hello world!n");
if(write(pipe_fd[WRITE],w_buf,strlen(w_buf))==-1)
printf("parent write overn ");
close(pipe_fd[WRITE]);
printf("parent close fd[WRITE] over n");
sleep(10);
}
在上面的代码中,当父进程向管道里写数据时,先关闭管道的读端,当子进程向管道里读数据时,关闭管道的写端,问题时,比如父进程在写完时,关闭写端时,好像没有唤醒子进程哦,即读端刚才被关闭了,子进程一直在等待,现在父进程关闭了写端,却没有打开读端,那么子进程岂不是一直等待下去??同理,如果在fork之后,子进程先被调度运行,那么在父进程写之前,子进程就已经关闭了写端,那么管道里根本就没有数据呀???
还有上面的代码中,在子进程读的那段代码里,sleep()语句是不是应该放在第一句,这样才能保证让父进程先做啊?
关于上面的close,其实我是这样认为的,如果是关闭写端,就在关闭之前,先看看有没有进程在读端等待,如果有的话,就“打开”读端,唤醒等待的进程。。。如果关闭读端,就看看有没有进程在等待写,有则唤醒.....不知道这样理解的对不对.....很想看看 管道通信里的close()函数的实现,但不知道在哪里查询,各位知不知道有什么linux 下的api(能够提供具体实现的)??
谢谢各位了....
|
fork() + 重定向 确实比较迷惑。
// 当 fork之后。产生了另外一个 进程。
// 下面这句if 只有子进程执行。 父进程。因为 fork返回值 不是0 所以不会执行 if里面的语句
if((pid=fork())==0) //子进程读
{
sleep(3); //确保父进程关闭写端 《- 这里 用 sleep 并不是好办法
exit(); // 这一点很重要 。一定要让子进程 执行完之后 结束
}
else if(pid>0) //父进程写
{
sleep(10); //