进程间通讯(一) 有名管道

来源:互联网 发布:手机怎么查mac地址 编辑:程序博客网 时间:2024/05/22 02:52

一、管道文件

1、A进程---->B进程   A进程的数据流通过通道向B进程

2、半双工通讯:数据流向单向传输 (同一时间)

   全双工通讯:数据流向双向传输 (同一时间)

注意:管道内数据流向没有定,所以理论上A也可以读,但是,A写入又读出没有意义,所以有名管道是任意两个进程之间的通讯。

3、管道文件既不是文件又不是进程空间,那又如何创建和操作呢?

二、管道操作

1、有名管道:应用于任意两个有名称进程之间数据的单向传递。

             在文件目录树中有一个文件标识(管道问件),实际不占据磁盘空间,数据缓存在内存上。

2、创建:命令方式:mkfifo

         函数方式:mkfifo( ) (命令在控制终端用,函数在程序中调用)

3、打开:写数据:write      读数据:read       关闭:close

4、maina.c:将A进程的内容写入管道文件

mainb.c:将管道文件的内容读入B进程

运行情况:

  (1)./maina 无结果   因为只有写,没有读

     阻塞运行:open没返回,导致整个进程阻塞

     打开另一个终端 ./mainb 输出结果。因为在之前写已经成功了,读运行后就会完成进程间的通讯。

5、阻塞运行函数:函数运行以后不会立即返回,需要某些条件的发生才会返回。open操作管道文件时,阻塞运行的函数。

  (1)如果一个进程以“只写”方式打开一个管道文件,open会阻塞运行,直到有一个进程以“读”的方式打开管道文件,open才会返回,进程接着执行。

  (2)如果一个进程以“只读”方式打开一个管道文件,open会阻塞运行,直到有一个进程以“写”的方式打开管道文件,open才返回,进程接着执行。

  (3)read函数也会阻塞运行,直到写端写入数据或所有的写端都关闭。

  (4)wrirte不阻塞 (阻塞条件:管道写满了  因为在内存开辟,所以有大小限制)

  







阅读全文
0 0
原创粉丝点击