Linux内核结构之进程间通信

    xiaoxiao2022-07-14  160

    一、管道

    管道是利用公共祖先的进行之间的共享文件描述符进行的一种通信方式,是Unix和Linux系统都支持的一种进程间通信机制,具有以下特点:

    管道是半双工的,数据只能向一个方向流动如果两个进程进行相互通信,必须建立两个管道只能用于父子进行或兄弟进程之间(具有亲缘关系的进程)单独构成一种独立的文件系统:管道对于两端的进程而言,就是一个文件,但它不是普通的文件,不属于某种文件系统,而是单独的构成一种文件系统,并只存在于内存中一个进程向管道中写入的内容被管道别一端的进程读出,写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读数据

    1、管道的创建

    #include <unistd.h> int pipe(int filedes[2]);

    一般,一个进程使用pipe()创建管道后,会再创建一个子进程,然后通过管道实现父子进程间的通信,一个管道拥有两个文件描述符用来通信,他们指向管道的索引节点,这两个文件描述符放在参数fileds中返回。fileds[0]用来读数据,fileds[1]用来写数据,调用成功返回0,错误返回1,并有错误代码errno.

    2、管道的读写

    对于写操作:写入管道的数据按到达次序排列,如果管道已满,则写被阻塞,直到管道数据被读操作读取;                       如果一次写操作的数据量小于管道容量,则写操作必须一次完成;                       如果一次写操作的数据量大于管道容量,则写操作分多次完成;                       如果用fcntl()函数设置写端为非阻塞方式,则管道满时不会阻塞写,而只对写返回0.

    对于读操作:按数据到达顺序读取数据,读完是数据在管道内不存在,所以数据在管道中不能重复利用;                       如果管道为空,且写端口是打开状态,则读操作被阻塞,直到有数据写入为止;                       如果管道中是数据量不够读操作指定的数量,则按实际的数量读取,并返回实际数量值;                       如果用fcntl()函数设置读端为非阻塞方式,则当管道为空时,读操作返回0.

    3、命名管道(FIFO)

    命名管道不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中,及时不是亲缘关系的进程,只要能访问给路径,也能进行通信,不想关的数据也能进行交换数据。

    (1)命名管道的创建

    #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname,mode_t mode); 参数*pathname表示路径名,也就是创建后FIFO的名字参数mode是FIFO文件的权限

    (2)命名管道的打开

    open(const char *filename,O_RDONLY); open(const char *filename,O_RDONLY|O_NONBLOCK); open(const char *filename,O_WRONLY); open(const char *filename,O_WRONLY|O_NONBLOCK);

    命名管道打开的时候必须两个进程相互配合才能打开成功

    (3)命名管道的读写

    命名管道的读写必须同时进行,打开一个FIFO进行读取通常会被阻塞,直到其他进程打开同样的FIFO进行写入,相反一样。

    最新回复(0)