开心过好每天!
2013年(23)
分类: LINUX
2013-08-04 13:38:10
存在于内存中的特殊文件,不支持lseek操作,是一种半双工通信,有固定的读端和写端,它分为无名管道和有名管道,无名管道可用于具有亲缘关系的进程间通信,有名管道
则除无名管道特点外,还可用于无亲缘关系的进程间通信。
无名管道
int pipeFd[2];//pipeFd[0]读,pipeFd[1]写
if(pipe(pipeFd) < 0)
{
perror("fail to pipe");
exit(EXIT_FAILURE);
}
读写规则:
A;读端存在,写管道
只要管道有空闲的空间,数据就会写到管道中
如果管道满,写管道堵塞
B:读端不存在,写管道
此时没有意义,写管道时内核会向这个进程发送SIGPIPE,此信号默认杀死进程
C:写端存在,读管道
如果管道中的数据 < 要求读的数据的大小,此时读取管道中实际的数据
如果管道中的数据 > 要求读的数据的大小,此时读取要求读出的数据的大小
如果管道中没有数据,读管道会堵塞
D:写端不存在,读管道
如果管道中有数据,读取实际数据
如果管道中没有数据,读管道不会阻塞,此时立即返回0(读到的全部是0)
有名管道
if(mkfifo("/home/linux/FIFO",0666) < 0 && errno != EEXIST)
{
perror("fail to mkfifo");
exit(EXIT_FAILURE);
}
注意:如果一个进程以只读方式打开一个有名管道,就会堵塞,直到另一个进程以只写方式打开有名管道文件
如果一个进程以只写方式打开一个有名管道,也会堵塞,直到另一个进程以只读方式打开有名管道文件
读写规则:同无名管道