IPC方法
Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量 在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开 辟一块缓冲区,进程1把数据从用户空间拷到内核缓区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信
常用的进程问通信方式有:
①管道(使用最简单)。
②信号(开销最小)
③共享映射区(无血缘关系)。
④本地套接字(最稳定)。
Pipe管道
①数据不能进程自己写,自己读。
②管道中数据不可反复读取。一旦读走,管道中不再存在。
③采用半双工通信方式,数据只能在单方向上流动。
④只能在有公共祖先的进程间使用管道
单工通信(收音机):只能由一方进行传输,另一方进行接收
半双工通信(对讲机):双方都可以进行传输,单上一方进行传输时,另一方无法进行传输
全双工通信(手机):双方都可以随时进行传输
管道关闭时只需要将这两个文件描述符关闭即可,可使用普通的close()函数逐个关闭各个文件描述符。
Int pipe(int fd[2]),其中fd[0]固定用于读端,fd[1]固定用于写端
管道创建成功以后,创建该管道的进程(父进程)同时掌握着管道的读端和写端。以下步骤为使用管道进行传输信息:
由于管道是利用环形队列实现的,数据从写端流入管道,丛读端流出,这样就实现了进程间通信。
6.管道的读写
①读管道:
1)read返回实际读到的字节数,一旦数据读走,就没有数据了。
2)可以允许多个读端,但存在竞争关系,速度快的进程读走后,数据就没有了。
2.管道中无数据:
1)管道写端被全部关闭,read 返回0(好像读到文件结尾)。
2)写端没有全部被关闭,read 阻塞等待
②写管道:
(1)管道已满,write 阻塞。
(2)管道未满,write 将数据写入,并返回实际写入的字节数。
(3)可以允许多个写端,但存在竞争关系,读会阻塞第一个写的进程,一旦读到内容,就读 取结束,如果多个写在读之前已全部写完,则全部拿出。
7.标准流函数popen()函数
与linux的文件操作中有基于文件流的标准I/O操作一样,管道的操作也支持基于文件流的模式。
FILE * popen( const char * command,const char * type);
如果 type 为 r,那么调用进程读进 command 的标准输出stdout。
如果 type 为 w,那么调用进程写到 command 的标准输入stdin。
若成功则返回文件指针,否则返回NULL,错误原因存于errno中。
有名管道(FIFO)是对无名管道的一种改进,它具有以下特点:
命令:mkfifo 管道名
int mkfifo(const char *pathname,mode_t mode);
FIFO通信使用
默认方式:
对于读可以设置阻塞和非阻塞
若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有据写入。
若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。
access函数确定访问权限
access()函数的功能是确定文件或文件夹的访问权限,即检查某个文件的存取方式,比如说是只读方式、只写方式等。如果指定的存取方式有效,则函数返回0,否则函数返回-1。
access_wfifo.c负责写内容
access_rfifo.c负责读内容