当前位置: 首页 > news >正文

进程间的通信(IPC机制)

进程间的通信有三大类:1.管道、信号;2IPC对象通信(共享内存,信号量集,共享内存是进程间最快的通信机制);3socket网络通信

1.管道:管道的特性是都是半双工的工作模式,所有的管道文件不支持定位操作(lseek,fseek)

        1.读端存在,一直向管道去写数据,超过64k,会写阻塞。

        2.写端存在,在管道中去读数据,如果管道为空,会读阻塞。

        3管道破裂,读端关闭,写端一直往管道中区写数据

        4read 0,写端关闭,读端读管道,如果管道为空的话,读会阻塞。

        使用管道的框架为:创建管道-》读写管道-》关闭管道

        无名管道:用于有亲缘关系的进程间通信,有固定的读写端。无名管道的建设应该在fork之前。

                int pipe(int pipefd[2]);//这是创建管道,pipefd中存放这管道文件的读写秒速符,其中pipefd[0]是固定的读端;pipefd[1]是固定的写端。

        有名管道:用于有任何两个单机进程间的通信。        

                框架为:创建有名管道-》打开有名管道-》读写管道-》关闭管道-》卸载管道

                mkfifo(const char *pathname,mode_t mode);在指定的路径下创建一个权限为mode的有名管道文件。

                remove():卸载管道。

2.信号:

        kill(pid_t,intsig);通过该函数可以给pid进程发送信号为sig的系统信号。

        raise(int sig)  ;用来给自己发sig信号。

        alarm(unsigned int seconds);定时由系统给当前进程发送信号。

        pause(void):进程暂停,不再继续执行。除非收到其他信号。

        void(*signal(int signum,void (*handler)(int)))(int);信号注册安函数,可以捕获系统发送给进程的信号。

3.共享内存:共享内存的原理是通过向内核空间申请一片空间来进行进程间的通信,两个相互通信的进程间可以使用同一个键值来申请到同一片内核空间,然后通过将这片内核中的共享空间映射到本地内存,通过对本地内存的读写来实现进程间的通信,在进程结束通信后,应当撤销映射,以保证内核空间的回收,最后删除内核空间中的共享内存区域

        使用共享内存进行进程间通信的框架为:

                创建唯一key值-》申请对象-》映射对象-》读写对象-》撤销映射-》删除对象

                ftok(const char *pathname,int proj_id);用于创建唯一的键值

                shmget(key_t key,size_t size,int shmflg);使用唯一键值向内核提出共享内存使用申请

                shmat(int shmid,const void *shmaddr,int shmflg):将指定shmid对应的共享内存映射到本地内存。shmaddr一般设置为NULL。

                shmdt(const void*shmaddr);撤销共享内存与本地内存之间的映射关系。

                shmctl(int shmid,int cmd,struct shmid_ds*buf);修改共享内存属性,也可以删除指定的共享内存对象,shmid是要删除的共享内存对象。


http://www.mrgr.cn/news/51352.html

相关文章:

  • 写论文再也不崩溃!学术救星ChatGPT教你轻松搞定
  • c#数组内数据打乱
  • VS2019 IDE,AddressSanitizer,检测C++代码内存问题
  • 时间序列预测(七)——梯度消失(Vanishing Gradient)与梯度爆炸(Exploding Gradient)
  • 智能电表是如何与远程控制系统连接的?
  • 【Matlab算法MATLAB实现的音频信号时频分析与可视化(附MATLAB完整代码)
  • Net Core发布文件没有View文件夹解决办法!
  • 【黑马redis基础篇】介绍和数据类型
  • WPF基础权限系统
  • Rust : FnOnce与线程池
  • 恺撒密码/置换密码案例
  • UltraISO(软碟通)制作U盘制作Ubuntu20.04启动盘
  • 基于SSM的大学学术交流论坛【附源码】
  • 3.Three.js程序基本框架结构和API说明
  • Unity之XR Interaction Toolkit 射线拖拽3DUI
  • 自适应过滤法—初级
  • KNN算法及KDTree树
  • 数据分析分段折线图
  • 【C++常见错误】0xC0000005: 读取位置 0x00000000 时发生访问冲突
  • .Net的潘多拉魔盒开箱即用,你学废了吗?