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

IO进程线程 day7

 使用消息队列完成两个进程之间相互通信

 

#include<my_head.h>
struct msgbuf
{long mtype;char mtext[128];
};
#define SIZE (sizeof(struct msgbuf) - sizeof(long))//分支线程从消息队列中读取类型2的消息
void *task(void *arg)
{int msgid = *((int *)arg);struct msgbuf buf;while(1){msgrcv(msgid,&buf,SIZE,2,0);printf("收到消息:%s\n",buf.mtext);if(strcmp(buf.mtext,"quit") == 0)break;	}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//创建key值key_t key = ftok("/",'k');if(key == -1){perror("ftok error");return -1;}//用key值创建消息队列int msgid = msgget(key,IPC_CREAT|0664);if(msgid == -1){perror("msgget error");return -1;}//创建分支线程pthread_t tid = -1;if(pthread_create(&tid,NULL,task,&msgid) != 0){printf("create tid error\n");return -1;}//主线程向消息队列中存放类型1的消息struct msgbuf buf;while(1){printf("请输入消息类型1>>>");scanf("%ld",&buf.mtype);printf("请输入消息正文:");scanf("%s",buf.mtext);msgsnd(msgid,&buf,SIZE,0);if(strcmp(buf.mtext,"quit") == 0)break;	}//删除消息队列if(msgctl(msgid,IPC_RMID,NULL) == -1){perror("msgctl error");return -1;}//阻塞回收分支线程资源pthread_join(tid,NULL);return 0;
}

 

#include<my_head.h>
struct msgbuf
{long mtype;char mtext[128];
};
#define SIZE (sizeof(struct msgbuf) - sizeof(long))//分支线程从消息队列中读取类型1的消息
void *task(void *arg)
{int msgid = *((int *)arg);struct msgbuf buf;while(1){msgrcv(msgid,&buf,SIZE,1,0);printf("收到消息:%s\n",buf.mtext);if(strcmp(buf.mtext,"quit") == 0)break;	}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//创建key值key_t key = ftok("/",'k');if(key == -1){perror("ftok error");return -1;}//用key值创建消息队列int msgid = msgget(key,IPC_CREAT|0664);if(msgid == -1){perror("msgget error");return -1;}//创建分支线程pthread_t tid = -1;if(pthread_create(&tid,NULL,task,&msgid) != 0){printf("create tid error\n");return -1;}//主线程向消息队列中存放类型2的消息struct msgbuf buf;while(1){printf("请输入消息类型2>>>");scanf("%ld",&buf.mtype);printf("请输入消息正文>>>");scanf("%s",buf.mtext);msgsnd(msgid,&buf,SIZE,0);if(strcmp(buf.mtext,"quit") == 0)break;	}//阻塞回收分支线程资源pthread_join(tid,NULL);return 0;
}

 将信号通信相关代码重新实现一遍

#include<my_head.h>
//信号处理函数
void handler(int signo)
{if(signo == SIGCHLD){waitpid(-1,NULL,WNOHANG);kill(getpid(),SIGKILL);}if(signo == SIGUSR1){printf("逆子,何至于此!!\n");}
}int main(int argc, const char *argv[])
{//创建一个子进程int pid = fork();if(pid > 0){//父进程通过绑定信号函数,将子进程发送的信号捕获后用函数处理if(signal(SIGCHLD,handler) == SIG_ERR){perror("signal error");return -1;}if(signal(SIGUSR1,handler) == SIG_ERR){perror("signal error");return -1;}//父进程在运行中while(1){printf("我真的还想再活500年\n");sleep(1);}}else if(pid == 0){//子进程在运行中,发送一个信号给父进程printf("来来来,喝酒喝酒!!!\n");sleep(5);printf("我已看破红尘,父亲陪我走吧\n");kill(getppid(),SIGUSR1);//子进程退出sleep(2);exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}return 0;
}

将共享内存相关代码重新实现一遍

发送端:

#include<my_head.h>
#define PAGE_SIZE 4096int main(int argc, const char *argv[])
{//创建key值int key = ftok("/",'k');if(key == -1){perror("");return -1;}//创建共享内存段int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);if(shmid == -1){perror("shmget error");return -1;}//将共享内存段映射到用户空间char *addr = (char *)shmat(shmid,NULL,0);if(addr == (void *)-1){perror("");return -1;}printf("addr = %p\n",addr);//操作共享内存段while(1){fgets(addr,PAGE_SIZE,stdin);addr[strlen(addr)-1] = 0;if(strcmp(addr,"quit") == 0)break;}//取消映射if(shmdt(addr) == -1){perror("shmdt error");return -1;}//删除共享内存if(shmctl(shmid,IPC_RMID,NULL) == -1){perror("shmctl error");return -1;}return 0;
}
#include<my_head.h>
#define PAGE_SIZE 4096int main(int argc, const char *argv[])
{//创建key值int key = ftok("/",'k');if(key == -1){perror("");return -1;}//创建共享内存段int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);if(shmid == -1){perror("shmget error");return -1;}//将共享内存段映射到用户空间char *addr = (char *)shmat(shmid,NULL,0);if(addr == (void *)-1){perror("");return -1;}printf("addr = %p\n",addr);//操作共享内存段while(1){printf("共享内存中的数据为:%s\n",addr);sleep(1);if(strcmp(addr,"quit") == 0)break;}//取消映射if(shmdt(addr) == -1){perror("");return -1;}return 0;
}

http://www.lryc.cn/news/276783.html

相关文章:

  • 扩展学习|数据融合助推商务智能与分析
  • Java项目:112SSM在线电影订票系统
  • Echarts——使用graphic组件在一个option内同时设置两个饼图的背景图
  • 编程笔记 html5cssjs 027 HTML输入属性(1/2)
  • 请求参数乱码问题
  • 【leetcode】力扣热门之反转链表【简单难度】
  • 【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示
  • 1599 - Ideal Path (UVA)
  • 计算机网络(超级详细笔记)
  • 老杨说运维 | 年末大讲回顾:运维的尽头也是大模型吗?
  • Unity 利用UGUI之Scrollbar制作进度条
  • MySQL之导入、导出
  • 【unity小技巧】FPS游戏实现相机的偏移震动、武器射击后退和后坐力效果
  • MINCO+汽车
  • 大模型机器人发展史:从VoxPoser、RT2到斯坦福Mobile ALOHA、Google机器人
  • Ubunutu18.04 ROS melodic 无人机 XTDrone PX4 Vins-Fuison 运行配置
  • Linux 常见服务配置
  • Flutter基础
  • MySQL-数据库概述
  • HTML---JQurey的基本使用
  • 搜索docker镜像
  • 旋变检测AD2s1205手册学习笔记
  • 【温故而知新】JavaScript的防抖与节流
  • C++模板——(3)类模板
  • 深度学习中Epoch和Batch Size的关系
  • Python采集微博评论做词云图
  • 一文详解VScode 的远程开发
  • 捕捉“五彩斑斓的黑”:锗基短波红外相机的多种成像应用
  • 解读 Sobit v2:铭文资产跨链更注重安全、易用性
  • [开源]万界星空开源MES系统,支持低代码大屏设计