完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
消息队列主要用到两种函数,写入和读取:
接收函数: size_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg) /* 其中: msqid:消息队列的标识码,queen 队列id就是identity 身份 msgp:指向消息缓冲区的指针pointer msgsz:消息的长短size msgtyp:等于0则返回队列最早的一个消息,大于0则返回类型为mtype的一个消息,小于0则返回其类型小于或等于mtype参数的绝对值的最小的一个消息。 msgflg:消息的标志位flag,falg=0则表示忽略,即标志位不起作用 返回值:成功则返回数据长度,错误返回-1 */ 发送函数 int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg) /* 其中: msqid:消息队列的标识码,queen 队列id就是identity 身份 msgp:指向消息缓冲区的指针pointer,发送接收可以通用 msgsz:消息的长短size msgflg:消息的标志位flag 返回值:成功则返回0,错误返回-1 */ 消息队列标识码获取函数: int msgget(key_t key,int msgflag) /* key:消息队列关联的标识符 msgflg:消息队列创建的标志和存取权限其常用IPC_CREAT及IPC_EXCL这两个宏定义作为标识,执行成功则返回消息队列的标识码否则返回-1 */ 这里开始放置实际操作代码: 首先是接收的: #include #include #include #include #include #include #include #include #include #define MAX_TEXT 512 struct msg_st { long int msg_type; char text[MAX_TEXT]; }; int main() { struct msg_st data; char buffer[BUFSIZ];//8192 set in stdio.h like this /* Default buffer size #define BUFSIZ 8192 */ int running =1; int msgid=-1; long int msgtyp =0; msgid=msgget((key_t)1234,0666|IPC_CREAT); if(msgid==-1) { fprintf(stderr,"msgget failed with error:%d n",errno); exit(EXIT_FAILURE); } while(running) { if(msgrcv(msgid,(void*)&data,BUFSIZ,msgtyp,0)==-1) { fprintf(stderr,"msgrcv failed with errno :%dn",errno); exit(EXIT_FAILURE); } printf("You write:%sn",data.text); if(strncmp(buffer,"end",3)==0) { running=0; } } if(msgctl(msgid,IPC_RMID,0)==-1) { fprintf(stderr,"remove msgid failed with errno :%dn",errno); exit(EXIT_FAILURE); } else { exit(EXIT_SUCCESS); } } 然后是发送的: #include #include #include #include #include #include #include #include #include #define MAX_TEXT 512 struct msg_st { long int msg_type; char text[MAX_TEXT]; }; int main() { struct msg_st data; char buffer[BUFSIZ];//8192 set in stdio.h like this /* Default buffer size #define BUFSIZ 8192 */ int running =1; int msgid=-1; msgid=msgget((key_t)1234,0666|IPC_CREAT); if(msgid==-1) { fprintf(stderr,"msgget failed with error:%d n",errno); exit(EXIT_FAILURE); } while (running) { printf("enter some text:"); scanf("%s",buffer); //fgets(buffer,BUFSIZ,stdin); data.msg_type =1; stpcpy(data.text,buffer); if(msgsnd(msgid,(void*)&data,MAX_TEXT,0)==-1) { fprintf(stderr,"msgsnd failed!n"); exit(EXIT_FAILURE); } if(strncmp(buffer,"end",3)==0) { running=0; } sleep(1); } exit(EXIT_SUCCESS); } 测试方法如下: 交叉编译无错误后放在目标系统中 先运行接收程序,这里使用后台运行 后台运行test ./bin/test & 后台查看是否在运行 jobs 运行成功且查看正在运行无误后,运行发送程序 输入你想要发送的代码,回车 接收程序自动打出你输入的数据 原作者:T触发器 |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
iTOP-3A5000主控板龙芯架构外加机箱就是一台电脑主机
859 浏览 0 评论
迅为RK3568开发板EMMC镜像导出打包update.img
909 浏览 0 评论
飞凌嵌入式-ELFBOARD 硬件知识分享-ELF 2电源电路讲解
1360 浏览 0 评论
2066 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程介绍之烧写所需镜像
1718 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 13:04 , Processed in 0.530187 second(s), Total 68, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号