进程之间的通信2

news/2024/10/22 0:03:24/

user1.c

#include <myhead.h>//创建发送信息的数据结构体
struct msgbuf
{long mtepe;char mdata[1024];
};
//宏定义数据的长度
#define MSG (sizeof(struct msgbuf)-sizeof(long))//线程一进行发送信息
void* task1(void * arg)
{//创建key的值key_t key = ftok("/",'a');if(key == -1){perror("key_t error");return NULL;}//创建消息队列int msgqid = msgget(key,IPC_CREAT|0664);if(msgqid == -1){perror("msgget error");return NULL;}//写入向队列中数据struct msgbuf buf;while(1){printf("请输入写入数据的类型>>>");scanf("%ld",&buf.mtepe);getchar();//吸收空格printf("请输入传输的数据:");fgets(buf.mdata,MSG,stdin);buf.mdata[strlen(buf.mdata)-1] = 0;//将消息放入队列中msgsnd(msgqid,&buf,MSG,0);printf("发送成功\n");if(strcmp(buf.mdata,"quit") == 0){break;}}
}void *task2(void * arg)
{//创建key的值//打开同一个key值key_t key = ftok("/",'a');if(key == -1){perror("key_t error");return NULL;}//创建消息队列int msgqid = msgget(key,IPC_CREAT|0664);if(msgqid == -1){perror("msgget error");return NULL;}//从消息队列中读取数据struct msgbuf buf;while(1){msgrcv(msgqid,&buf,MSG,1,0);printf("接受到的消息为:%s\n",buf.mdata);if(strcmp(buf.mdata,"quit") == 0){break;}}}int main(int argc, const char *argv[])
{//定义2个线程pthread_t pid1 ,pid2;//创建线程if(pthread_create(&pid1,NULL,task1,NULL) != 0){perror("pthread_create error");return -1;}if(pthread_create(&pid2,NULL,task2,NULL) != 0){perror("pthread_create error");return -1;}//主线程程序printf("用户一在线,可以进行通信\n");//回收资源//主线程阻塞等待线程完成通信pthread_join(pid1,NULL);pthread_join(pid2,NULL);//创建key的值//打开同一个key值key_t key = ftok("/",'a');if(key == -1){perror("key_t error");return NULL;}//创建消息队列int msgqid = msgget(key,IPC_CREAT|0664);if(msgqid == -1){perror("msgget error");r//删除队列if(msgctl(msgqid,IPC_RMID,NULL) != -1){perror("error");return NULL;}return 0;
}

user2.c

#include <myhead.h>//创建发送信息的数据结构体
struct msgbuf
{long mtepe;char mdata[1024];
};
//宏定义数据的长度
#define MSG (sizeof(struct msgbuf)-sizeof(long))//线程一进行发送信息
void* task1(void * arg)
{//创建key的值key_t key = ftok("/",'a');if(key == -1){perror("key_t error");return NULL;}//创建消息队列int msgqid = msgget(key,IPC_CREAT|0664);if(msgqid == -1){perror("msgget error");return NULL;}//写入向队列中数据struct msgbuf buf;while(1){printf("请输入写入数据的类型>>>");scanf("%ld",&buf.mtepe);getchar();//吸收空格printf("请输入传输的数据:");fgets(buf.mdata,MSG,stdin);buf.mdata[strlen(buf.mdata)-1] = 0;//将消息放入队列中msgsnd(msgqid,&buf,MSG,0);printf("发送成功\n");if(strcmp(buf.mdata,"quit") == 0){break;}}
}void *task2(void * arg)
{//创建key的值//打开同一个key值key_t key = ftok("/",'a');if(key == -1){perror("key_t error");return NULL;}//创建消息队列int msgqid = msgget(key,IPC_CREAT|0664);if(msgqid == -1){perror("msgget error");return NULL;}//从消息队列中读取数据struct msgbuf buf;while(1){msgrcv(msgqid,&buf,MSG,2,0);printf("接受到的消息为:%s\n",buf.mdata);if(strcmp(buf.mdata,"quit") == 0){break;}}}int main(int argc, const char *argv[])
{//定义2个线程pthread_t pid1 ,pid2;//创建线程if(pthread_create(&pid1,NULL,task1,NULL) != 0){perror("pthread_create error");return -1;}if(pthread_create(&pid2,NULL,task2,NULL) != 0){perror("pthread_create error");return -1;}//主线程程序printf("用户一在线,可以进行通信\n");//回收资源//主线程阻塞等待线程完成通信pthread_join(pid1,NULL);pthread_join(pid2,NULL);//创建key的值//打开同一个key值key_t key = ftok("/",'a');if(key == -1){perror("key_t error");return NULL;}//创建消息队列int msgqid = msgget(key,IPC_CREAT|0664);if(msgqid == -1){perror("msgget error");r//删除队列if(msgctl(msgqid,IPC_RMID,NULL) != -1){perror("error");return NULL;}return 0;
}

 


http://www.ppmy.cn/news/1540933.html

相关文章

记录一次hiveserver2卡死(假死)问题

问题描述 给开发人员开通了个账号&#xff0c;连接hive进行查询&#xff0c;后来发现&#xff0c;hive服务有时候会卡死&#xff0c;查询不了&#xff0c;连不上&#xff08;所有账号/客户端都连不上hive&#xff09;&#xff0c;但在chd里面看监控&#xff0c;服务器资源状态…

目前最新 dnSpy V6.5.1版本,最好的 .NET 程序调试、编辑、反编译软件

目前最新 dnSpy V6.5.1版本&#xff0c;最好的 .NET 程序调试、编辑、反编译软件 一、 简介二、新发布程序更新功能三、官方下载&#xff1a; 一、 简介 dnSpy 是一个调试器 .NET 程序集的编辑器。即使没有源代码&#xff0c;也可以使用它来编辑和调试程序集。主要特点&#x…

Linux内核 -- 高性能运算操作之 this_cpu_* 接口

Linux this_cpu_* 接口的作用与用法 Linux 内核中&#xff0c;this_cpu_* 接口用于访问和操作每个 CPU 独有的 per-CPU 变量&#xff0c;提供了一组高效的方法来处理 per-CPU 数据。在 SMP&#xff08;对称多处理&#xff09;系统中&#xff0c;per-CPU 变量可以有效地减少缓存…

Docker-nginx数据卷挂载

数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。 以Nginx为例&#xff0c;我们知道Nginx中有两个关键的目录&#xff1a; html&#xff1a;放置一些静态资源conf&#xff1a;放置配置文件 如果我们要让Nginx代理我们…

基于Multisim8路彩灯循环控制电路设计与仿真

1&#xff0e;彩灯能够自动循环点亮&#xff1b; 2&#xff0e;彩灯循环频率快慢可调&#xff1b; 3&#xff0e;彩灯具有8路输出。 4&#xff0e;自行设计脉冲信号产生电路。 链接&#xff1a;https://pan.baidu.com/s/1PhpVy58Y6-_uXnie8KYyzg 提取码&#xff1a;zjad

STM32L010F4 最小系统设计

画一个 STM32L010F4 的测试板子...... by 矜辰所致前言 最近需要用到一个新的 MCU&#xff1a; STM32L010F4 &#xff0c;上次测试的 VL53L0X 需要移植到这个芯片上&#xff0c;网上一搜 STM32L010F4&#xff0c;都是介绍资料&#xff0c;没有最小系统&#xff0c;使用说明等。…

使用Vscode配置ftp连接远程服务器(上传本地文件)

1.安装插件 扩展商店搜sftp,点击进行安装。 2.配置json文件 crtl+shift+p 输入ftp配置命令 sftp:config {"name": "My Server", //设置名字"host": "localhost"</

uniapp上如何绑定全局事件总线(引入自定义全局组件例如弹窗)

1、在main.js中挂载bus // main.js Vue.prototype.$bus new Vue(); uni.$bus Vue.prototype.$bus; // 确保在 uni 上绑定 2、写一个全局弹窗组件 <template><view v-if"visible" class"toast-container"><view class"icon-conta…