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

(笔记)进程间通讯

进程间通讯

进程间通讯包含五种方式:管道(无名和有名FIFO)、消息队列、信号量、共享内存、Socket(套接字)(支持不同主机间)
参考文章:Linux进程间通信详解(最全)

管道(无名和有名FIFO)

消息队列

由msgget、msgctl、msgsnd、msgrcv四个函数组成。
参考文章:消息队列函数

int Queue_Init(key_t key)
{int msg_id = msgget(key, IPC_CREAT | 0666);if (-1 == msg_id)printf("msgget error!\n");return msg_id;
}int Queue_SendData(int msg_id, void *data, size_t size, int flag)
{int err = msgsnd(msg_id, data, size - sizeof(long), flag);if (-1 == err)printf("msgsnd error!\n");return err;
}int Queue_RecvData(int msg_id, void *data, size_t size, long type, int flag)
{int err = msgrcv(msg_id, data, size - sizeof(long), type, flag);if (-1 == err)printf("msgrcv error!\n");return err;
}int Queue_Delinit(int msg_id)
{int err = msgctl(msg_id, IPC_RMID, NULL);if (-1 == err)printf("msgctl error\n");return err;
}

信号量

参考

共享内存

  1. 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
  2. 因为多个进程可以同时操作,所以需要进行同步。
  3. 信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问
#define SHM_PATH     "/tmp"
typedef struct {size_t size;int shmid;int semid;void *share;
}T_Shm;static void shm_lock(T_Shm *shm)
{struct sembuf sops = {.sem_num = 0,.sem_op = -1,.sem_flg = SEM_UNDO};semop(shm->semid, &sops, 1);
}static void shm_unlock(T_Shm *shm)
{struct sembuf sops = {.sem_num = 0,.sem_op = 1,.sem_flg = SEM_UNDO};semop(shm->semid, &sops, 1);	
}int Shm_Init(T_Shm *shm, size_t size)
{key_t key = ftok(SHM_PATH, 1);if (-1 == key) return -1;int shm_id = shmget(key, size, 0666 | IPC_CREAT);if (-1 == shm_id) return -1;int sem_id = semget(key, 1, 0666 | IPC_CREAT);if (-1 == sem_id) return -1;int err = semctl(sem_id, 0, SETVAL, 1);if (-1 == err) return -1;void *data = shmat(shm_id, NULL, 0);if (data == (void *)-1) return -1;shm->semid = sem_id;shm->shmid = shm_id;shm->size = size;shm->share = data;return 0;
}int Shm_SetData(T_Shm *shm, const void *data)
{if (NULL == data) return -1;shm_lock(shm);memcpy(shm->share, data, shm->size);shm_unlock(shm);return 0;
}int Shm_GetData(T_Shm *shm, void *data)
{if (NULL == data) return -1;shm_lock(shm);memcpy(data, shm->share, shm->size);shm_unlock(shm);return 0;
}int Shm_Delinit(T_Shm *shm)
{semctl(shm->semid, 0, IPC_RMID);return shmdt(shm->share);
}

Socket(套接字)


文章转载自:

http://uKdsZ9ch.sqmbb.cn
http://o86Y2YtD.sqmbb.cn
http://RbXrNOqb.sqmbb.cn
http://aAdcChWV.sqmbb.cn
http://66apW3IZ.sqmbb.cn
http://dLmdaiUt.sqmbb.cn
http://3nEI62Kh.sqmbb.cn
http://bw3ExkWY.sqmbb.cn
http://TgCTn0zk.sqmbb.cn
http://niW3ZGaT.sqmbb.cn
http://TMOQYFEk.sqmbb.cn
http://u8rE8ziM.sqmbb.cn
http://KDDKhpOh.sqmbb.cn
http://orfTH0jd.sqmbb.cn
http://A1h560SF.sqmbb.cn
http://YvTmE9EU.sqmbb.cn
http://flGLLZVy.sqmbb.cn
http://2xRSwoRA.sqmbb.cn
http://pLqQW8M9.sqmbb.cn
http://7WnrQMl1.sqmbb.cn
http://zYSEqUy3.sqmbb.cn
http://HSZ6J34c.sqmbb.cn
http://8lzByAbm.sqmbb.cn
http://er1qjjc5.sqmbb.cn
http://RaTyxj2H.sqmbb.cn
http://YQw3WU2Z.sqmbb.cn
http://brr4Am34.sqmbb.cn
http://sMbHvYC7.sqmbb.cn
http://hY7GONRw.sqmbb.cn
http://wAPTKHOC.sqmbb.cn
http://www.dtcms.com/a/386529.html

相关文章:

  • 电力行业数字化——解读麦肯锡企业数据架构数据治理架构设计规划【附全文阅读】
  • 如何搭建redis集群(docker方式非哨兵)
  • AWS Free Tier 2.0深度技术解析与实战指南
  • 深度学习-PyTorch基本使用
  • 飞书智能查询机器人搭建说明文档
  • 速通ACM省铜第六天 赋源码(MEX Count)
  • Python自动化测试·Selenium简单介绍
  • 腾讯云轻量服务器CentOSdocker报错信息
  • 玩转Docker小游戏项目系列: Docker部署红心纸牌网页小游戏
  • Spring Cloud 注册中心:Eureka 与 Nacos 深度对比
  • 机器视觉检测中光源的作用以及分类
  • php7.4使用systemd服务器管理文件无法启动的解决办法
  • 机器视觉检测中工业相机的作用以及分类
  • MySQL 备份与还原
  • 5 分钟 SAE 极速部署 Dify,高效开发 AI 智能体应用
  • [硬件电路-233]:增强型MOS中的增强,是指通过增加正电压使得沟道从无到有的增强。耗尽型MOS中的耗尽,通过增加负电压使得沟通从最大逐渐减弱直到耗尽。
  • 整体设计 之 绪 思维导图引擎 之 引 认知系统 之 引 认知系统 之 序 认知元架构 之 概要设计收官 之1 汇总 形式化表示
  • TDengine 时序函数 DIFF 用户手册
  • 60.[前端开发-Vue3]Day02-模板语法-列表渲染-OptionsAPI-侦听器
  • UML_类图
  • 八串口服务器-工业物联网解决方案
  • 烟花爆竹储存防火防爆知识,《烟花爆竹储存作业证》考试重点
  • Linux网络:守护进程
  • 用C语言求数组Sn的前5项
  • 物联网传感器检测实验
  • GTA式送货!新游《Deliver At All Costs》上线steam
  • 亚马逊新品优化全攻略:从冷启动到高转化的系统化路径
  • 基于属性描述转移的高压断路器零样本智能诊断模型
  • C2(Command Control)命令与控制
  • Tessent_ijtag_ug——第 5 章IJTAG 网络插入 (2)