
linux消息队列,共享内存,信号量综合运用
发布日期:2021-05-07 07:21:43
浏览次数:23
分类:精选文章
本文共 3886 字,大约阅读时间需要 12 分钟。
关于对消息队列,共享内存,信号量的具体介绍
https://blog.csdn.net/qq_46777053/article/details/108804717mySemSercer.c
#include#include #include #include #include #include #include struct msgbuf { long mtype; /* message type, must be > 0 */ char mtext; /* message data */};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) */};void pGet(int sem_id){ struct sembuf sops; sops.sem_num = 0; sops.sem_op =-1; sops.sem_flg = SEM_UNDO; if(semop(sem_id,&sops,1) == -1){ printf("pGet failed!!\n"); exit(-1); }}void vPut(int sem_id){ struct sembuf sops; sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = SEM_UNDO; if(semop(sem_id,&sops,1) ==-1){ printf("vPut failed!!\n"); exit(-1); }}//目的: 通过消息队列来实现进程间的通讯,在进程到消息来访问共享内存,并且是通过信号量来控制int main (){ int shm_id,msg_id,sem_id,i; struct msgbuf readBuf; char *shmaddr; key_t key; if((key = ftok(".",1)) < 0){ printf("ftok error\n"); exit(-1); } //1.创建共享内存 if((shm_id = shmget(key,1024*4, IPC_CREAT|0666)) == -1){ printf("shmget error\n"); exit(-1); } //2.连接共享内存 shmaddr = shmat(shm_id,0,0); if(shmaddr < 0){ printf("shmat error\n"); exit(-1); } //3.创建消息队列 if((msg_id = msgget(key,IPC_CREAT|0777)) == -1){ printf("msgget error\n"); exit(-1); } //4.创新信号量 if((sem_id = semget(key,1,IPC_CREAT|0666)) == -1){ printf("semget errot\n"); exit(-1); } //5. 初始化信号量 union semun initsem; initsem.val = 0; //刚刚开始是没有锁的 if(semctl(sem_id,0,SETVAL,initsem) == -1){ printf("initsemctl error\n"); return -1; } while(1) { msgrcv(msg_id,&readBuf,sizeof(readBuf.mtext),888,0); if(readBuf.mtext == 'q'){ printf("red from que: %c\n",readBuf.mtext); break; } else if(readBuf.mtext == 'r'){ pGet(sem_id); printf("red from que: %c\n",readBuf.mtext); printf("shmat data:%s\n",shmaddr); //输出共享内存中的数据 vPut(sem_id); } } printf("quit\n"); shmdt(shmaddr);// 断开与共享内存的连接 shmctl(shm_id,IPC_RMID,NULL); msgctl(msg_id,IPC_RMID,NULL); semctl(sem_id,0,IPC_RMID); return 0;}
mySemClient.c
#include#include #include #include #include #include #include struct msgbuf { long mtype; /* message type, must be > 0 */ char mtext; /* message data */};void pGet(int sem_id){ struct sembuf sops; sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = SEM_UNDO; if(semop(sem_id,&sops,1) == -1){ printf("pGet failed!!\n"); exit(-1); }}void vPut(int sem_id){ struct sembuf sops; sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = SEM_UNDO; if(semop(sem_id,&sops,1) ==-1){ printf("vPut failed!!\n"); exit(-1); }}int main(){ int shm_id,msg_id,sem_id,i=1; char *shmaddr; char data; key_t key; if((key = ftok(".",1)) == -1){ printf("ftok error\n"); exit(-1); } //1.获取共享内存 if((shm_id =shmget(key,1024*4,0)) == -1){ printf("shmget error\n"); exit(-1); } //2.连接共享内存 shmaddr = shmat(shm_id, 0, 0); if(shmaddr < 0){ printf("shamt error\n"); exit(-1); } //3.获取消息队列 if((msg_id = msgget(key,0)) == -1){ printf("msgget error\n"); exit(-1); } //4.获取信号量 if((sem_id = semget(key,1,0)) ==-1){ printf("semget error\n"); exit(-1); } printf("---------send data---------\n"); printf("---------------------------\n"); struct msgbuf buf; while(i){ printf("please intput:\n"); //gets(data); scanf("%c",&data); getchar(); switch(data){ case'w': pGet(sem_id); printf("data=%c\n",data); buf.mtype = 888; buf.mtext = 'r'; printf("intput shmaddr:\n"); scanf("%s",shmaddr);//向共享内存写入数据 getchar(); msgsnd(msg_id,&buf,sizeof(buf.mtext),0); vPut(sem_id); break; case'q': pGet(sem_id); printf("send quit\n"); buf.mtype = 888; buf.mtext = 'q'; msgsnd(msg_id,&buf,sizeof(buf.mtext),0); i = 0; vPut(sem_id); break; case's': pGet(sem_id); printf("s,success\n"); break; case'p': vPut(sem_id); printf("p,success\n"); break; } } shmdt(shmaddr); return 0;}
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月31日 05时28分27秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
力扣:地图分析(多源bfs)
2021-05-08
NC15136: 迷宫
2021-05-08
动态点击a标签
2021-05-08
@RequestBody和@RequestParam
2021-05-08
oracle创建序列语法
2021-05-08
springboot通过控制层跳转页面404
2021-05-08
idea2020 没有 tomcat server
2021-05-08
jq动态修改元素的onclick属性的值
2021-05-08
为什么讨厌所谓仿生AI的说法
2021-05-08
ORACLE 客户端工具
2021-05-08
Elasticsearch下载慢?分享百度云下载-ELK
2021-05-08
云服务器springboot jar项目开启jmx remote监控-解决无法连接的问题
2021-05-08
文件上传-FileUpload
2021-05-08
快速排序
2021-05-08
Pyinstaller打包的exe文件过大的解决方法
2021-05-08
Linux的软链接跟Windows快捷方式一样?
2021-05-08
更改github的默认语言类型
2021-05-08
修改ubuntu镜像源mirrors为阿里源
2021-05-08
使用bigdecima实例化时传int和string时的精度丢失
2021-05-08