2024.02.04

写出三种进程间通信的代码示例

有名管道

创建两个有名管道文件

#include <myhead.h>
int main(int argc, const char *argv[])
{if(mkfifo("pipe1",0664)==-1){perror("mkfifo pipe1 error");return -1;}if(mkfifo("pipe2",0664)==-1){perror("mkfifo pipe2 error");return -1;}printf("关闭请按回车\n");getchar();system("rm pipe1");system("rm pipe2");return 0;
}

 发送


#include <myhead.h>
int main(int argc, const char *argv[])
{int wfd=-1;if((wfd=open("./mypipe",O_WRONLY))==-1){perror("wfd open error");return -1;}char wbuf[128]="";while(1){printf("请输入>>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;write(wfd,wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit")==0){break;}}close(wfd);return 0;
}

接收

#include <myhead.h>
int main(int argc, const char *argv[])
{int rfd=-1;if((rfd=open("./mypipe",O_RDONLY))==-1){perror("rfd open error");return -1;}char rbuf[128]="";while(1){read(rfd,rbuf,sizeof(rbuf));printf("收到一条消息:%s\n",rbuf);if(strcmp(rbuf,"quit")==0){break;}}close(rfd);return 0;
}

消息队列

 发送

#include <myhead.h>
struct msgbuf
{long mtype;char mtext[1024];
};
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{key_t key=ftok("/",'k');if(key==-1){perror("key create error");return -1;}printf("key=%#x\n",key);int msgid=msgget(key,IPC_CREAT|0664);if(msgid==-1){perror("msgget error");return -1;}printf("msgid=%d\n",msgid);struct msgbuf buf;while(1){printf("请输入您要发送的类型\n");scanf("%ld",&buf.mtype);printf("请输入消息内容\n");scanf("%s",buf.mtext);msgsnd(msgid,&buf,SIZE,0);if(strcmp(buf.mtext,"quit")==0){break;}}return 0;
}

 接收

#include <myhead.h>
struct msgbuf
{long mtype;char mtext[1024];
};
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{key_t key=ftok("/",'k');if(key==-1){perror("key create error");return -1;}printf("key=%#x\n",key);int msgid=msgget(key,IPC_CREAT|0664);if(msgid==-1){perror("msgget error");return -1;}printf("msgid=%d\n",msgid);struct msgbuf buf;while(1){msgrcv(msgid,&buf,SIZE,10,0);printf("收到消息%s\n",buf.mtext);if(strcmp(buf.mtext,"quit")==0){break;}}return 0;
}

信号灯集

头文件

#ifndef __SEM_H__
#define __SEM_H__
#include <myhead.h>
//信号灯集的申请,初始化信号灯,并返回信号灯集的id
int create_sem(int semcount);
//申请信号灯资源操作 p操作
int P(int semid,int semno);
//释放信号灯资源操作 v操作
int V(int semid,int semno);
//信号灯集的删除
int del_sem(int semid);#endif
#include "sem.h"union semun {int              val;    /* Value for SETVAL */struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET*/unsigned short  *array;  /* Array for GETALL, SETALL */struct seminfo  *__buf;  /* Buffer for IPC_INFO(Linux-specific) */};
int init_sem(int semid,int semno)
{int val=-1;printf("请输入标号为%d的灯的初始值:",semno);scanf("%d",&val);getchar();union semun us;us.val=val;if(semctl(semid,semno,SETVAL,us)==-1){perror("set val error");return -1;}return 0;
}
//信号灯集的申请,初始化信号灯,并返回信号灯集的id
int create_sem(int semcount)
{//1.创建key值key_t key=ftok("/",'y');if(key==-1){perror("fork error");return -1;}//2.通过key值创建一个信号灯集int semid=semget(key,semcount,IPC_CREAT |IPC_EXCL|0664);if(semid==-1){if(errno==EEXIST){semid=semget(key,semcount,IPC_CREAT);return semid;}else{perror("semget error");return -1;}}//3.给信号灯集中的信号灯进行初始化操作for(int i=0;i<semcount;i++){init_sem(semid,i);}return semid;
}
//申请信号灯资源操作 p操作
int P(int semid,int semno)
{struct sembuf buf;buf.sem_num=semno;buf.sem_op=-1;buf.sem_flg=0;if(semop(semid,&buf,1)==-1){perror("P error");return -1;}return 0;
}
//释放信号灯资源操作 v操作
int V(int semid,int semno)
{struct sembuf buf;buf.sem_num=semno;buf.sem_op=1;buf.sem_flg=0;if(semop(semid,&buf,1)==-1){perror("V error");return -1;}return 0;}
//信号灯集的删除
int del_sem(int semid)
{if(semctl(semid,0,IPC_RMID,0)==-1){perror("del error");return -1;}return 0;
}

 发送

#include "sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{int semid=create_sem(2);if(semid==-1){perror("creat_sem error");return -1;}//1.创建一个key值key_t key=ftok("/",'t');if(key==-1){perror("ftok error");return -1;}printf("key=%#x\n",key);//2.通过key值创建共享内存段int shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664);if(shmid==-1){perror("shmget error");return -1;}printf("shmid=%d",shmid);//3.将共享内存映射到用户空间char *addr=shmat(shmid,NULL,0);if(addr==(void *)-1){printf("shmat error");return -1;}//4.使用共享内存段while(1){P(semid,1);printf("please enter");fgets(addr,PAGE_SIZE,stdin);addr[strlen(addr)-1]=0;V(semid,0);if(strcmp(addr,"quit")==0){break;}}//5.取消映射if(shmdt(addr)==-1){perror("shmdt error");return -1;}//6.删除共享内存if(shmctl(shmid,IPC_RMID,0)==-1){perror("shmctl error");return -1;}return 0;
}

 接收

#include "sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{int semid=create_sem(2);if(semid==-1){perror("creat_sem error");return -1;}//1.创建一个key值key_t key=ftok("/",'t');if(key==-1){perror("ftok error");return -1;}printf("key=%#x\n",key);//2.通过key值创建共享内存段int shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664);if(shmid==-1){perror("shmget error");return -1;}printf("shmid=%d",shmid);//3.将共享内存映射到用户空间char *addr=shmat(shmid,NULL,0);if(addr==(void *)-1){printf("shmat error");return -1;}//4.使用共享内存段while(1){P(semid,0);printf("共享内存中的数据为:%s\n",addr);V(semid,1);if(strcmp(addr,"quit")==0){break;}}//5.取消映射if(shmdt(addr)==-1){perror("shmdt error");return -1;}//6.删除共享内存if(shmctl(shmid,IPC_RMID,NULL)==-1){perror("shmctl error");return -1;}del_sem(semid);return 0;
}

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

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

相关文章

sentinel的Context创建流程分析

sentinel入门 功能 限流&#xff1a;通过限制请求速率、并发数或者用户数量来控制系统的流量&#xff0c;防止系统因为流量过大而崩溃或无响应的情况发生。 熔断&#xff1a;在系统出现故障或异常时将故障节点从系统中断开&#xff0c;从而保证系统的可用性。 降级&#xf…

性能测试工具架构

背景 性能测试工具&#xff08;LoadRunner为例&#xff09; 性能测试工具通常是指那些用来支持压力、负载测试&#xff0c;能够录制和生成脚本、设置和部署场景、产生并发用户和向系统施加持续压力的工具。 性能测试工具录制的是服务端与应用之间的通信数据&#xff0c;而不是…

【Spring】自定义注解 + AOP 记录用户的使用日志

目录 ​编辑 自定义注解 AOP 记录用户的使用日志 使用背景 落地实践 一&#xff1a;自定义注解 二&#xff1a;切面配置 三&#xff1a;Api层使用 使用效果 自定义注解 AOP 记录用户的使用日志 使用背景 &#xff08;1&#xff09;在学校项目中&#xff0c;安防平台…

【RT-DETR有效改进】 DySample一种超级轻量的动态上采样算子(上采样中的No.1)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、 本文介绍 本文给大家带来的改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具…

整理:汉诺塔简析

大体上&#xff0c;要解决一个汉诺塔问题&#xff0c;就需要解决两个更简单的汉诺塔问题 以盘子数量 3 的汉诺塔问题为例 要将 3 个盘子从 A 移动到 C&#xff0c;就要&#xff1a; 将两个盘子从 A 移动到 B&#xff08;子问题 1&#xff09; 为了解决子问题 1&#xff0c;就…

clickhouse在MES中的应用-跟踪扫描

开发的MES&#xff0c;往往都要做生产执行跟踪扫描&#xff0c;这样会产生大量的扫描数据&#xff0c;用关系型数据库&#xff0c;很容易造成查询冲突的问题。 生产跟踪扫描就发生的密度是非常高的&#xff0c;每个零部件的加工过程&#xff0c;都要被记录下来&#xff0c;特别…

Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践(三)

接上文&#xff0c;本章尝试在RV1106上使用TBB。依然是一言难尽&#xff0c;此文依然只是记录实践过程。 源码下载&#xff0c;编译TBB 下载地址: https://github.com/oneapi-src/oneTBB 版本使用 oneTBB-2021.11.0&#xff0c;这个版本可以使用cmake编译。 cmake配置完后&am…

动手学深度学习v2-线性回归-笔记

简化核心模型 假设1: 影响房价的关键因素是卧室个数&#xff0c;卫生间个数和居住面积&#xff0c;记为 x 1 x_{1} x1​&#xff0c; x 2 x_{2} x2​&#xff0c; x 3 x_{3} x3​假设2: 成交价是关键因素的加权和 y w 1 x 1 w 2 x 2 w 3 x 3 b yw_{1}x_{1}w_{2}x_{2}w_{3…

鲲鹏--垂直生态领导者

这是ren_dong的第24篇原创 1、概述 华为鲲鹏920&#xff1a;性能最高的ARM架构服务器芯片 鲲鹏是华为在芯片领域布局的重要一环 &#xff0c;是垂直生态的领导者&#xff0c;鲲鹏芯片诞生于2020年 &#xff0c;已获得ARMv8架构的永久授权&#xff0c;主要聚焦通用计算领域华为针…

typecho 在文章中添加 bilibili 视频

一、获取视频来源&#xff1a; 可以有2种方式来定位一个 bilibili 视频&#xff1a; 第一种是使用 bvid 参数定位第二种是使用 aid 参数定位 如何获取这两个参数&#xff1f; 首先我们可以看看 bilibili 网站中的视频页面链接其实可以分为两种&#xff1a; 第一种是类似&a…

建材智能工厂数字孪生可视化管控平台,推进建材行业数字化转型

建材智能工厂数字孪生可视化管控平台&#xff0c;推进建材行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的重要趋势。在建材行业中&#xff0c;智能工厂和数字孪生技术的应用正在改变传统的生产模式和管理方式&#xff0c;为行业的数字化转型…

C语言常见面试题:C语言中如何进行加密解密编程?

在C语言中进行加密和解密编程通常涉及到使用加密算法和相关的库。下面是一些常用的加密和解密算法以及如何使用它们的基本说明&#xff1a; AES加密算法&#xff1a; AES&#xff08;Advanced Encryption Standard&#xff09;是一种常用的对称加密算法。在C语言中&#xff0c;…

clr的执行模型-笔记

学习来源&#xff1a;《CLR via C by Jeffrey Richter 》第四版&#xff0c;第1章 clr的执行模型 1.C#编译生成执行程序集文件 编译文件的组成&#xff1a;pe32/pe32头&#xff0c;clr头&#xff0c;元数据&#xff0c;IL pe32/pe32头&#xff1a;windows标准执行文件头 cl…

mac 12.7.3 Unity 2021.3.14 XCode 14.2 成功将unity游戏编译到IPhone中,并上架appstore

上一篇文章 mac 10.15.7 & Unity 2021.3.14 & XCode 12.4 -&#xff1e; Unity IOS 自动安装 Cocoapods 失败解决方法 从上一篇文章完成后&#xff0c;unity 已经可以导出 xcode 工程&#xff0c;但是&#xff0c;app是没法上架到appstore上的&#xff0c;原因如下&am…

C++函数对象-运算符函数对象 - 比较 - 实现 x == y 的函数对象(std::equal_to)

任何定义了函数调用操作符的对象都是函数对象。C 支持创建、操作新的函数对象&#xff0c;同时也提供了许多内置的函数对象。 运算符函数对象 C 针对常用的算术和逻辑运算定义了很多函数对象&#xff1a; 比较 实现 x y 的函数对象 std::equal_to template< class T >…

DelayQueue的使用

具体思路&#xff1a; 在容器初始化的时候就创建出一个 延迟队列 然后项目启动后随即启动一个线程一直监听这个队列 手动调用接口往队列中添加任务 依赖 一个最简单的web的应用即可项目文件结构 第一步&#xff1a;在项目启动的时候就创建出一个延迟队列 Configuration publ…

小程序定制开发前,应该考虑些什么?

引言 在移动互联网时代&#xff0c;小程序已经成为许多企业和个人推广业务、提供服务的理想平台。然而&#xff0c;在进行小程序定制开发之前&#xff0c;开发者和业务方需要细致入微地考虑一系列关键因素&#xff0c;以确保最终的小程序既能满足用户需求&#xff0c;又能够顺…

PHP入门指南:起步篇

PHP入门指南&#xff1a;起步篇 PHP入门指南&#xff1a;起步篇什么是PHP&#xff1f;PHP 的优点PHP 开发环境搭建选择本地服务器软件包安装PHP环境配置Web服务器和PHP测试PHP安装 第一个PHP脚本PHP基础语法标记注释变量数据类型常量条件语句循环函数 PHP入门指南&#xff1a;起…

Oracle Server一台价值百万的服务器内存更换过程

数据库代码敲多了&#xff0c;看乏了吧&#xff01; 带各位DBA看看你们的数据库运行在什么样的硬件上。 1、故障现象 事发时2号位置报警 登录ILO发现内存报警 查看详细信息 查看详细报警 2、关于ORACLE 服务器DIMM 备用 默认情况下在 Oracle ILOM 中启用 DIMM 备用。由 DIMM 提…

[linux] kolla-ansible 部署的openstack 修改mariadb默认端口号

kolla-ansible 部署前修改global.yml #freezer_database_backend: "mariadb" database_port: 9306 mariadb_port: 9306如果已经部署成功&#xff0c;直接修改配置文件里的端口号重启是没有用的&#xff0c;怀疑内部做了缓存&#xff0c;查看openstack 使用的memcach…