无名管道:
1)特点:
a.只能用于具有具有亲缘关系的进程间通信。
b.半双工通信方式,具有固定的读端和写端。
c.无名管道可以看作一种特殊的文件,用文件io对其进行读写。
d.管道是一种基于文件描述符的通信方式,当一个管道建立,默认打开文件描述符fd【0】读端,fd【1】写端。
2)函数:pipe
int fd[2];
if(pipe(fd)<0)
{
perror("pipe err");
return -1;
}
注意事项:
管道中无数据时读操作阻塞,且管道中无数据将写端关闭,读操作会立即返回。
管道中写满64k数据时写阻塞,读出4k空间写继续直至写满。
只有在管道读端存在时,写入才有意义,否则会发生管道破裂,向管道中写入数据的进程将会收到内核传来的SIGPIPE信号。
【2】有名管道:
1)特点:
a.可以用于两个互不相干的进程之间的通信。
b.有名管道可以通过路径名指出,在文件系统中可见,但内容存放在内存中。
c.通过文件IO进行操作。
d.有名管道遵循先入先出规则
e.不支持LSEEK操作
f.半双工通信
2)函数:mkfifo
int mkfifo(const char *filename,mode_t mode);
功能:创健有名管道
参数:filename:有名管道文件名
mode:权限
返回值:成功:0
失败:-1,并设置errno号
注意对错误的处理方式:
如果错误是file exist时,注意加判断,如:if(errno == EEXIST)
注意事项:
-
以只写方式打开,写阻塞,直到另一个进程将读打开
-
以只读方式打开,读阻塞,直到另一个进程将写打开
-
以可读可写方式打开,管道中无数据,读阻塞。