当管道为空时:read阻塞
当管道为满时:write阻塞
有名管道(mkfifo fifo):管道文件在磁盘,写入管道的数据在内存(无名管道不存在)
有名管道和无名管道间的主要区别:
有名管道可以用在任意两个进程之间,无名管道(pipe)只能用在父子进程之间。
先创建管道,再执行fork();
重定向:用管道的写端覆盖标准输出(dup2(fd[1],1) "1"代表标准输出)
读端关闭,写端写入数据引发错误异常,write执行后产生sigpipe信号;
写端关闭,读端不再阻塞,read返回值为0;
怎样以非阻塞的方式在管道中读取数据?
1.在open的时候传入O_NONBLOCK;
2.按非阻塞的方式打开:fcntl(fd,F_SETFL,O_NONBLOCK);
3.在mode设置O_NONBLOCK;