进程间通信--管道

来源:互联网 发布:移领 收钱吧 付呗 知乎 编辑:程序博客网 时间:2024/06/05 20:33

管道的分类:
-无名管道
-有名管道
-其他一些

无名管道

1.管道为半双工的通信方式,无名管道是在有亲缘关系(父子,兄弟等)进程之间使用,有名管道可以再不相关的进程之间通信.


2.无名管道单独构成一个独立的文件系统 :管道对于管道两边的进程而言就是一个文件,但无名管道不是普通文件,他不属于你系统中的文件系统,而是自立门户,单独构成一个文件系统,而且只存在于内存中.


3.管道的大小:65536(2^16 byte) 亲测,我的是redhat


4.当写端不存在时,读管道不会阻塞;当写段存在时,管道中没有数据,读取管道时将阻塞


5.只有管道的读端存在时,向管道中写入数据才有意义,否则,如果写入,就会有一个来自内核的SIGPIPE信号,默认的处理方式是终止程序

有名管道

1.有名管道不同于无名管道的地方在于他提供了一个路径名与指向关联.并且在文件系统中以fifo的形式存在于文件系统中,这样不同的进程就可以通过这个路径进行访问.


2.有名管道用open打开


3.有名管道名字在文件系统中,内容存放在内存中


4.mkfifo第一个参数为路径名,若已经存在,就会返回一个EEXIST错误,我们写代码时应该检查这个错误,如果有就直接打开好了.


5.有名管道的打开规则

-有个进程想要以写的方式打开一个有名管道,如果有其他进程以读的方式打开该管道,这样就可以成功打开;否则,如果设置了阻塞,进程就会等待直到有进程以读方式打开;没有设置的话,就直接返回错误.
-反过来读是一样的


6.有名管道的读写规则

读数据

-如果有进程以写方式打开了管道,管道内没有数据,设置阻塞就会一直阻塞;没有设置阻塞就返回-1,error为EAGAIN.以后再试.
-阻塞原因有两种:有其他进程在读;没有数据
-没有进程写方式打开,如果设置了阻塞读操作就会阻塞.
-写端关闭,有数据就继续读,否则就返回0,而不会阻塞.

写数据

-为了保证数据的原子性,当写入的数据不大于管道的总大小时,空闲够用,就写入;否则,睡眠等到够用再写入.当写入的数据大于管道总大小时,不保证原子性,有空闲就写入.(设置了阻塞)
-为了保证数据的原子性,当写入的数据不大于管道的总大小时,空闲够用,就写入;否则,返回EAGAIN.当写入的数据大于管道总大小时,不保证原子性,有空闲就写入.(没有设置阻塞)

0 0
原创粉丝点击