Live2D

进程间通信机制

为什么需要进程间通信?

进程是独立的资源分配单元,当进程需要访问别的进程资源时,就需要借助进程间通信来实现。这就好比公司内开发一个特别大的项目,不同子项目间也需要进行沟通,交流。

进程通信的方式

管道

  无名管道(内存文件):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲 缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系。直接使用聚合管道符号 | 。

  命名管道(FIFO文件,借助文件系统):有名管道也是半双工的通信方式,但是允许在没有亲缘 关系的进程之间使用,管道是先进先出的通信方式。

  

mkfifio hello //创建命名管道

  管道的创建原理

    

int pipe(int fd[2])

  该函数会返回两个文件描述符,一个读,一个写。因为Linux系统实际一切皆文件,所以管道的创建实际也是创建在文件系统上的,管道会对应一个特殊的inode---get_pip_node。特别地,匿名管道/有名管道实际就是内核里面的一串缓存。区别在于,有名管道会在ext4文件系统上真的创建一个文件。

 

但是管道只能一端写入,所以想要双工通信时会出现混乱。一般而言,会关闭父进程的读取fd,只保留写入的fd,而子进程关闭写入的fd,只保留读取的fd,如果需要双向通行,则应该创建两个管道。 

 

共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多 个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设 计的。但是共享内存的访问往往涉及到临界区资源的竞争,因此需要与信号量、锁,配合使用来实现进程间的同步和通信。

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

套接字:适用于不同机器间进程通信,在本地也可作为两个进程通信的方式。

信号:用于通知接收进程某个事件已经发生,比如按下ctrl + C就是信号。Linux提供了很多种信号,可以通过man 7 singal命令查看。当有信号发生时,一般而言,用户进程可以有以下方式对信号进行处理。

  1.执行默认操作。Linux对每种信号都规定了默认操作。

  2.捕捉信号。可以为一个信号定义一个信号处理函数。当信号发生时,就执行相应的信号处理函数。

  3.忽略信号,不做任何处理。

申请一个信号处理函数

  可根据此链接学习。https://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html

信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,实 现进程、线程的对临界区的同步及互斥访问。P操作申请资源,V操作释放资源。

 

posted @ 2022-05-12 12:05  eminemrapgod  阅读(353)  评论(0编辑  收藏  举报