4

进程间8种通信方式

 2 years ago
source link: https://zhangyiming748.github.io/post/jin-cheng-jian-8-chong-tong-xin-fang-shi/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

进程间8种通信方式

2022-09-04 操作系统原理

进程通信:
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信.

匿名管道通信

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

// 需要的头文件
#include <unistd.h>

// 通过pipe()函数来创建匿名管道
// 返回值:成功返回0,失败返回-1
// fd参数返回两个文件描述符
// fd[0]指向管道的读端,fd[1]指向管道的写端
// fd[1]的输出是fd[0]的输入.
int pipe (int fd[2]);

通过匿名管道实现进程间通信的步骤如下:

  • 父进程创建管道,得到两个⽂件描述符指向管道的两端
  • 父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道.
  • 父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管道写端(因为管道只支持单向通信).⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信.

高级管道通信

高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式.

有名管道通信

高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式.

消息队列通信

消息队列(message queue) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少\管道只能承载无格式字节流以及缓冲区大小受限等缺点.

信号量通信

信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段.

信号(sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生.

共享内存通信

共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信.

套接字通信

套接字(socket):套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK