Linux进程间通信

在这里插入图片描述


文章目录

  • 一、Linux 进程间通信
  • 二、Linux 进程间同步


一、Linux 进程间通信

    进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享内存、Socket(套接字)等。其中 Socket和支持不同主机上的两个进程IPC。

  1. 管道
#include <stdio.h>
int pipe(int fd[2]);  // 返回值:若成功返回0,失败返回-1;
  1. FIFO,也称为命名管道
#include <stdio.h>
// 返回值:成功返回0, 出错返回-1
int mkfifo(const char* pathname, mode_t mode);
  1. 消息队列
#include <stdio.h>
// 创建或打开消息队列:成功返回队列ID,失败返回-1
int msgget(key_t key, int flag);
// 添加消息:成功返回0,失败返回-1
int msgsnd(int msqid, const void ptr, size_t size, int flag);
// 读取消息:成功返回消息数据的长度,失败返回-1
int msgrcv(int msqid, void* ptr, size_t size, long type, int flag);
// 控制消息队列:成功返回0, 失败返回-1
int msgctl(int msqid, int cmd, struct msqid_ds * buf);
  1. 信号量
#include <stdio.h>
// 创建或获取一个信号量组:若成功返回信号量集ID,失败返回-1
int semget(key_t key, int num_sems, int sem_flags);
// 对信号量组进行操作,改变信号量的值:成功返回0,失败返回-1
int semop(int semid, struct sembuf semoparray[], size_t numops);  
// 控制信号量的相关信息
int semctl(int semid, int sem_num, int cmd, ...);
  1. 共享内存
#include <stdio.h>
// 创建或获取一个共享内存:成功返回共享内存ID,失败返回-1
int shmget(key_t key, size_t size, int flag);
// 连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1
void shmat(int shm_id, const void *addr, int flag);
// 断开与共享内存的连接:成功返回0,失败返回-1
int shmdt(void addr); 
// 控制共享内存的相关信息:成功返回0,失败返回-1
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);

6种Linux进程间的通信方式
Linux进程间通信详解(最全)
Linux系统-进程间通信

二、Linux 进程间同步

   常用的同步方式有:互斥锁、条件变量、读写锁、记录锁(文件锁)和信号灯,以下为互斥锁同步和条件变量同步示例。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>#define SHM_SIZE 4096
#define SHM_NAME "/myshm"
#define SEM_NAME "/mysem"typedef struct {pthread_mutex_t mutex;pthread_cond_t cond;char buffer[SHM_SIZE];
} shm_t;int main(int argc, char *argv[]) {int fd, pid;shm_t *shm;pthread_mutexattr_t mutex_attr;pthread_condattr_t cond_attr;// 创建共享内存区域fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);if (fd < 0) {perror("shm_open");exit(1);}// 设置共享内存大小if (ftruncate(fd, sizeof(shm_t)) < 0) {perror("ftruncate");exit(1);}// 将共享内存映射到进程地址空间shm = mmap(NULL, sizeof(shm_t), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (shm == MAP_FAILED) {perror("mmap");exit(1);}// 初始化互斥量属性和条件变量属性pthread_mutexattr_init(&mutex_attr);pthread_condattr_init(&cond_attr);pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);// 初始化互斥量和条件变量pthread_mutex_init(&shm->mutex, &mutex_attr);pthread_cond_init(&shm->cond, &cond_attr);// 创建子进程pid = fork();if (pid < 0) {perror("fork");exit(1);}if (pid == 0) {// 子进程写入共享内存sleep(1);pthread_mutex_lock(&shm->mutex);sprintf(shm->buffer, "Hello, world!");pthread_cond_signal(&shm->cond);pthread_mutex_unlock(&shm->mutex);exit(0);} else {// 父进程读取共享内存pthread_mutex_lock(&shm->mutex);pthread_cond_wait(&shm->cond, &shm->mutex);printf("Received message: %s\n", shm->buffer);pthread_mutex_unlock(&shm->mutex);}// 删除共享内存if (shm_unlink(SHM_NAME) < 0) {perror("shm_unlink");exit(1);}return 0;
}

【Linux线程同步专题】一、什么是线程同步、互斥量与死锁
【Linux线程同步专题】二、读写锁
【Linux线程同步专题】三、条件变量
【Linux线程同步专题】四、信号量
【Linux线程同步专题】五、进程间同步

Linux进程间共享内存通信时如何同步?(附源码)
linux进程同步机制,五个常用的
Linux操作系统进程同步的几种方式及基本原理

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/132750.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Activity页面不显示toolbar

页面显示如下&#xff0c;显示toolbar, 想实现不显示toolbar&#xff0c; 1、在manifest里设置 android:theme"style/AppThemeNoTitle"&#xff0c;可以隐藏&#xff0c;但是整个页面显示为透明的了&#xff0c;activity整体类型发生改变 2、或者设置这个&#xf…

Win11磁盘分区后在恢复之前分区的方法介绍

电脑磁盘分区对于新购买的电脑来说&#xff0c;是整理电脑第一步要做的事情&#xff0c;大家一般都会根据自己的需要把磁盘划分为C盘、D盘、E盘等等方面文件的管理&#xff0c;今天小编给大家介绍一下Win11操作系统下&#xff0c;如何进行分区&#xff0c;如何恢复之前的分区&a…

yolov5加关键点回归

文章目录 一、数据1&#xff09;数据准备2&#xff09;标注文件说明 二、基于yolov5-face 修改自己的yolov5加关键点回归1、dataloader,py2、augmentations.py3、loss.py4、yolo.py 一、数据 1&#xff09;数据准备 1、手动创建文件夹: yolov5-face-master/data/widerface/tr…

机器学习-概述与贝叶斯算法

机器学习的一般步骤&#xff1a;数据搜集、数据清洗、特征工程、数学建模。数据划分&#xff1a;训练集、验证集、测试集。K折交叉验证&#xff1a;解决数据量不够大问题&#xff0c;解决参数调优问题。深度学习不用做特征工程&#xff0c;传统机器学习要。损失函数&#xff0c…

ROS IMU 数据发布---rviz_imu_plugin的安装

ROS中发布IMU传感器消息 - 润新知 按照上述链接的方法执行 catkin_make install -DCMAKE_INSTALL_PREFIX/opt/ros/noetic 后报错 这个错误是因为在安装过程中&#xff0c;CMake无法将文件复制到目标路径。这可能是由于权限不足导致的。可以尝试使用以下命令更改目标文件夹的…

在线免费AI绘画工具

体验地址 点我进行AI绘画 使用 选择以文搜图进行绘画 提问 介绍 首先&#xff0c;我们来了解一下ChatGPT。作为一个人工智能语言模型&#xff0c;它可以自动回答你的问题、提供信息&#xff0c;并与你进行流畅的对话。它通过大量的训练数据和机器学习算法&#xff0c;学…

IP真人识别方法与代理IP检测技术

随着互联网的发展&#xff0c;IP地址在网络安全和数据分析中扮演着重要的角色。为了维护网络的安全性和识别真实用户&#xff0c;IP地址的真实性和来源成为了一个关键问题。 什么是IP真人识别&#xff1f; IP真人识别是一种技术&#xff0c;旨在确定IP地址背后的用户是否为真实…

GNOME 45 动态三层缓存补丁更新

导读GNOME 45 "Rīga" 上周已正式发布&#xff0c;此版本虽然有许多针对桌面环境的改进&#xff0c;但上游缺少的一个功能是 Canonical 主导的 Mutter 动态三层缓存。 动态三层缓存用于在需要时提升性能&#xff0c;并且已被证明有助于提高桌面渲染性能&#xff0c;…

移动应用-Android开发基础\核心知识点

Android开发基础 知识点 1 介绍了解2 系统体系架构3 四大应用组件4 移动操作系统优缺点5 开发工具6 配置工具7 下载相关资源8JDK下载安装流程9配置好SDK和JDK环境10 第一个Hello word11 AS开发前常用设置12模拟器使用运行13 真机调试14 AndroidUI基础布局15 加载展示XML布局16…

浏览器插件开发爬虫记录

常用爬虫有各种各样的反爬限制&#xff0c;而如果是小数据量并且该网站反爬手段非常厉害的前提下&#xff0c;可以考虑使用浏览器插件作为爬虫手段 基本代码来源于这位博主分享的插件代码&#xff0c; 主要在他的基础上加了 请求代理、管理面板、脚本注入拦截到的请求数据和管…

npm install报错

在命令提示符窗口下载npm&#xff0c;报错如下&#xff1a; $npm install报错信息如下&#xff1a; npm WARN old lockfile npm WARN old lockfile The package-lock.json file was created with an old version of npm, npm WARN old lockfile so supplemental metadata must…

【数据结构】二叉树的链式结构及实现

目录 1. 前置说明 2. 二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层序遍历 3. 节点个数及高度等 4. 二叉树的创建和销毁 1. 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在大家对二叉树结构…