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

linux_c IPC消息队列练习

练习题要求:

要求通过IPC的消息队列,实现两个进程之间通讯功能(通过命令行终端)

实现代码:

1.main.c

int main(int argc, const char *argv[])
{//存放线程调用的变量(qid,sendType,recvType)thread_info_t param;//校验参数if(checkArgs(&param,argc, argv)==-1){return -1;}//创建消息队列int qid=createMsgQueue();param.qid=qid;if(qid == -1){perror("create msg queue error");return -1;}//配置数据发送线程pthread_t t1;if(pthread_create(&t1, NULL, taskSend, &param)!=0){perror("发送线程创建失败");return -1;}//配置数据接收线程pthread_t t2;if(pthread_create(&t2, NULL, taskRecv, &param)!=0){perror("接收线程创建失败");return -1;}//销毁线程pthread_join(t1, NULL);pthread_join(t2, NULL);//销毁消息队列msgctl(qid, IPC_RMID, NULL);printf("程序执行完成\n");return 0;
}

2.chat.h

typedef struct{long mtype;char mtext[256];
}msg_t;typedef struct{int qid;//消息队列的idlong sendType;//发送消息的typelong recvType;//接收消息的type
}thread_info_t;#define TEXT_SIZE (sizeof(msg_t)-sizeof(long))int createMsgQueue();
void* taskSend(void* arg);
void* taskRecv(void* arg);int checkArgs(thread_info_t *p,int argc,const char* argv[]);

3.chat.c

int createMsgQueue(){//ftok 拿keykey_t key=ftok("/", 111);if(key == -1){perror("ftok error");return -1;}printf("key=[%#X]\n", key);//获取queue的idint qid=msgget(key, IPC_CREAT | 0664);if(qid==-1){perror("msgget error");return -1;}return qid;
}void* taskSend(void* arg){//qid, msgtypethread_info_t* param=(thread_info_t*)arg;msg_t msg;msg.mtype=param->sendType;while(1){printf("输入消息>>");fflush(stdout);fgets(msg.mtext,TEXT_SIZE,stdin);msg.mtext[strlen(msg.mtext)-1]=0;//向队列发送消息if(-1==msgsnd(param->qid, &msg, TEXT_SIZE, 0)){perror("msgsnd error");break;}if(strcmp("quit", msg.mtext) ==0){raise(SIGKILL);break;}}pthread_exit(NULL);
}void* taskRecv(void* arg){thread_info_t* param=(thread_info_t*)arg;msg_t msg;msg.mtype=param->recvType;while(1){int cnt=msgrcv(param->qid,&msg,TEXT_SIZE,param->recvType, 0);if(cnt ==-1){perror("msgrcv");break;}printf("收到:%s\n", msg.mtext);if(strcmp("quit",msg.mtext)==0){raise(SIGKILL);break;}}pthread_exit(NULL);
}int checkArgs(thread_info_t *p,int argc, const char* argv[]){if(argc != 3){fprintf(stderr,"输入参数过少\n");return -1;}sscanf(argv[1],"%ld",&p->sendType);sscanf(argv[2],"%ld",&p->recvType);return 0;
}

运行效果:

小进步:

对比昨天的pipe的练习,最后无法关闭多线程程序,通过SIGKILL信号完成了实现。


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

相关文章:

  • 速盾:直播cdn加速原理是什么?
  • Yolo目标检测:Yolo v1简介
  • Yolo目标检测:实时性与准确性的完美结合
  • 枚举的使用举例说明
  • Mendix:禁用按钮点击事件校验文本框输入
  • 常用DateUtils工具类
  • [云] Deploying Your First Serverless Application
  • 每日OJ题_牛客_数组变换_贪心+位运算_C++_Java
  • Python+Selenium+Pytest+POM自动化测试框架封装
  • Redis优劣势分析
  • 智慧公厕厂家:智慧公厕建设推动城市公厕智能化变革
  • 【Java】正则表达式详解
  • 倪师学习笔记-天纪-斗数星辰介绍
  • 《IDE 巧用法宝:使用技巧全解析与优质插件推荐》
  • Windows进程的睡眠与唤醒
  • 洛谷刷题 P1003 [NOIP2011 提高组] 铺地毯
  • coze上构建必应搜索工作流
  • Xilinx 7系列FPGA中IDDR的介绍(一)
  • @ConditionalOnExpression条件加载Bean
  • WSL2-轻量级AI训练场景最佳生产环境
  • 前端拦截302重定向
  • Python 代码主要用于处理和分析 OpenFOAM(一种用于计算流体力学的软件)生成的数据,并提供了一些实用的工具函数。
  • HarmonyOS Next应用开发——多种方式实现图片解码
  • 【论文精读】把一切转成mesh!MeshAnything和MeshAnythingV2论文解析
  • 挖掘 M2 Pro 32G UMA 内存潜力:在 Mac 上本地运行清华大模型 ChatGLM2-6B
  • 云服务器遭受攻击后的应急响应与解决策略