进程间通讯(一)管道

来源:互联网 发布:taft地震波数据下载 编辑:程序博客网 时间:2024/06/08 06:17

进程间通讯:多个进程之间数据交换。

进程间通讯方式:信号、管道、信号量、消息队列、共享内存、套接字(socket)

进程创建:pid_t  fork

进程间数据共享问题:

               全局变量、堆、栈       不共享

               文件                             共享

按照信号传送方向与时间的关系,数据通信可以分为三种类型:单工通信、半双工通信、全双工通信。

            单工通信:信号只能向一个方向传输,任何时候都不能改变信号的传送方向。

            半双工通信:信号可以双向传递,但是必须是交替进行,一个时间只能向一个方向传送。

            全双工通信:信号可以同时双向传递。

管道在同一时刻只能是半双工通信。


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

                  应用于任意两个进程之间数据的单向传递。

具体操作

       创建:(命令方式)mkfifo         (函数方式)mkfifo()

       打开:           open

       写数据:        write

       读数据:        read

       关闭:           close


maina.c文件



mainb.c文件                                                                                                                                                       



阻塞运行函数:函数调用以后并不会立即返回,需要等待某些条件的发生才会返回。例如open操作管道文件时,阻塞运行的函数。

        如果一个进程以只写方式打开一个管道文件时,open会阻塞运行,直到有一个进程以只读方式打开管道,open才会返回,程序才会接着运行。

        read函数也会阻塞运行,直到写端写入数据或者所有写端都关闭。read读取数据会将内存上的数据清空。


无名管道:相对于有名管道而言,无名管道在使用时产生,不使用后释放,并不会在系统上留下任何蛛丝马迹。

                   无名管道因其在使用前没有任何的标示,所以它只能应用于父子进程之间。


       ps:管道都是半双工通信,而无名管道创建后,父进程在fork产生子进程后,两进程分别有一对读写端。

       fork之后,要么子进程关闭读端父进程关闭写端,要么子进程关闭写端父进程关闭读端。