当前位置: 技术问答>linux和unix
管道?大家看看
来源: 互联网 发布时间:2015-03-19
本文导语: 一个简单的管道写操作,创建管道,fork子进程 但是有一句:close(fd[0]) 如果这句保留,3秒之后输出: write: 4096 如果这句删除,将会阻塞; 为什么会这样呢?3秒期间子进程也有管道描述符,即使父进程关了子进程中还...
一个简单的管道写操作,创建管道,fork子进程
但是有一句:close(fd[0])
如果这句保留,3秒之后输出: write: 4096
如果这句删除,将会阻塞;
为什么会这样呢?3秒期间子进程也有管道描述符,即使父进程关了子进程中还打开着吧,困惑。
#include "unistd.h"
#include "sys/types.h"
#define WR 10000
main()
{
char wrline[WR];
int fd[2];
int res;
pid_t pid;
memset(wrline,'K',WR);
pipe(fd);
pid=fork();
if(pid==0)
{
sleep(3);
_exit(0);
}
else
{
/*close(fd[0]);*/ /*就是这一句*/
res=write(fd[1],wrline,WR);
printf("write: %dn",res);
}
}
但是有一句:close(fd[0])
如果这句保留,3秒之后输出: write: 4096
如果这句删除,将会阻塞;
为什么会这样呢?3秒期间子进程也有管道描述符,即使父进程关了子进程中还打开着吧,困惑。
#include "unistd.h"
#include "sys/types.h"
#define WR 10000
main()
{
char wrline[WR];
int fd[2];
int res;
pid_t pid;
memset(wrline,'K',WR);
pipe(fd);
pid=fork();
if(pid==0)
{
sleep(3);
_exit(0);
}
else
{
/*close(fd[0]);*/ /*就是这一句*/
res=write(fd[1],wrline,WR);
printf("write: %dn",res);
}
}
|
fd[0]在两个进程中都关闭的话,他的引用计数为0,会被删除,反之句柄所代表的pipe一端存在。