【Linux】Linux进程间通信——管道通信

目录

管道通信

1.无名管道

2.标准流管道通信

3.有名管道通信


 

        进程间通信(IPC,Inter-Process Communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程间必须相互通话。IPC接口就提供了这种可能性。Linux IPC有无名管道、高级管道通信、有名管道通信、消息队列通信、信号量通信、信号、共享内存通信、套接字通信,每个IPC方法均有它的优点和局限性,一般,对于单个程序而言使用所有的IPC方法是不常见的。

管道通信

管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读数据)从管道的头部读出数据,随内核持续。数据被一个进程读出后,将被从管道中删除,其他读进程将不能再读到这些数据。管道提供了简单的流控制机制,进程试图读空管道时,进程将阻塞。同样,管道已经满时,进程再试图向管道写入数据,进程将阻塞。管道包括无名管道和有名管道两种,前者用于父进程和子进程间,兄弟进程和之间的通信,后者用于统一系统的任意两个进程的通信

1.无名管道

无名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能再具有亲缘关系的进程间使用,进程的亲缘关系通常是指父子进程关系。

无名管道由pipe()函数创建:int pipe(int filedis[2]);

当一个管道建立时,它会创建两个文件描述符:filedis[0]用于读管道,filedis[1]用于写管道(成功返回0,失败返回-1)

无名管道例程:

【Linux】Linux进程间通信——管道通信_第1张图片

 编译运行结果:

【Linux】Linux进程间通信——管道通信_第2张图片

 

2.标准流管道通信

标准流管道通信(popen),与Linux中文件操作中文件流的标准I/O一样,标准流管道也是基于文件流的模式,它将一系列的创建过程合并到一个函数popen中完成。使用popen,程序员不用再编写代码来创建一个管道、fork一个子进程、关闭不需要的文件描述符等,大大减少了代码的编写工作了。Popen创建的管道必须使用标准的I/O函数进程操作,不能使用read、write等不带缓冲的I/O函数。调用标准流管道,需要头文件。标准流管道打开函数FILE *pipen(const char *command, const char *type);其中command为字符串,需要NULL结尾,这个字符通常包含一个shell命令。第2个参数type,控制管道中的数据流方向。此参数可以为r或者w,分别表示读或写,但是不能同时为读和写。标准流管道关闭函数int pclose(FILE *stream);

        使用标准管道来执行“ps -ef”命令

【Linux】Linux进程间通信——管道通信_第3张图片

 编译结果:

【Linux】Linux进程间通信——管道通信_第4张图片

 

3.有名管道通信

有名管道通信(named pipe, FIFO):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。创建命名管道int mkfifo(const char *pathname, mode_t mode),需要头文件#include和#include。一旦创建了一个FIFO,就可以用open打开它,一般的文件访问函数(close、read、write等)都可用于FIFO。

FIFO例程:本程序包含2个程序,一个作为服务端、一个作为客户端。

服务器端代码如下:

【Linux】Linux进程间通信——管道通信_第5张图片

服务器负责读管道内的数据。

客户端代码如下:

【Linux】Linux进程间通信——管道通信_第6张图片

 客户端负责写数据。

客户端与服务器端运行结果如下:

f64e8dd8e93c49c190e994cd05fb073e.png

 

 e5f5487b71804348ae8db301f2583603.png

 

 

 

 

 

 

 

你可能感兴趣的:(Linux,linux,服务器,c语言,后端)