msgsnd与msgrcv函数出现invalid参数的问题
来源:互联网 发布:地理信息大数据 编辑:程序博客网 时间:2024/05/01 01:59
本文转自:http://www.cppblog.com/lmlf001/archive/2007/09/19/32486.html
今天写了一个小程序,使用了消息队列的msgsnd msgrcv函数,由msgsnd函数循环处理由终端输入的消息,然后把它发送到消息队列,而另一个进程则循环读取消息,进行处理。
这时,问题出现了,每次调用msgrcv函数的时候,它总是第一次调用成功,而第二次返回错误,察看errno=22,打印出来是invalid argument,无效参数。
凭它的说明,可以看出可能是我调用函数的时候参数错误,但为什么第一次能调用成功呢?
检查了一下,没看出问题。然后google之,发现许多人和我出现了同样的问题,但没有人给出解答。
自己鼓捣了好久,还是没搞定。
然后man 2 msgsnd,一下午不知打了多少遍了,这一次从头到尾一个字一个字的读了下去。
终于发现问题了。
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
man文档里有一句话:The mtext field is an array (or other structure) whose size is specified by msgsz
一直没认真去看,想当然的以为msgsz就是msgp的大小了,原来人家不是,自己自作多情了。。。
这么一个小问题花了我半个下午,但现在发现总比以后出错要好多了~
写出来,给那些第一次使用的朋友们看~~
把修改后的代码贴出来:
struct s_msg{ long type; char mtext[256];};
//sndint main(){ int mid; if((mid=msgget(4446,IPC_CREAT|0666))==-1) perr_exit("msgget:"); char buf[BUFSIZE]; memset(buf,'\0',BUFSIZE); s_msg mymsg; while(fgets(buf,BUFSIZE,stdin)!=NULL){ if(strlen(buf)<=2)continue; buf[strlen(buf)]='\0'; if(sscanf(buf,"%d%s",&mymsg.type,mymsg.mtext)!=2) perr_exit("Invalid input:"); if(msgsnd(mid,&mymsg,256,IPC_NOWAIT)) //msgsiz 为sizeof(mtext[]),而非sizeof(s_msg) perr_exit("msgsnd:"); memset(buf,'\0',BUFSIZE); } return 0;}
//rcvint main(int argc,char **argv){ int mid; if((mid=msgget(4446,IPC_CREAT|0666))==-1) perr_exit("msgget:"); s_msg mymsg; while(1) { if(msgrcv(mid,&mymsg,256,0,MSG_NOERROR)==-1) //就是这里出错的,记住你了 perr_exit("msgrcv"); if(mymsg.type!=4446) cout<<mymsg.type<<" :"<<mymsg.mtext<<endl; else { cout<<"4446 quit\n"; break; } memset(&mymsg,0,sizeof(mymsg)); } return 0;}
- msgsnd与msgrcv函数出现invalid参数的问题
- msgsnd与msgrcv函数
- msgsnd()函数 msgrcv()函数
- msgsnd()函数 msgrcv()函数 .
- msgsnd()函数 msgrcv()函数
- 消息队列函数 msgsnd 出现Invalid argument错误的解决办法
- msgsnd/msgrcv函数祥解
- linux函数之msgrcv/msgsnd
- 消息队列所用到的函数 msgget() msgsnd() msgrcv() msgctl()
- msgsnd/msgrcv
- msgsnd/msgrcv
- msgrcv/msgsnd
- Linux系统调用--msgsnd/msgrcv函数详解
- Linux系统调用--msgsnd/msgrcv函数详解
- Linux系统调用--msgsnd/msgrcv函数详解
- Linux系统调用--msgsnd/msgrcv函数详解
- Linux系统调用--msgsnd/msgrcv函数简介
- 消息队列函数(msgget、msgctl、msgsnd、msgrcv)
- 算法导论之插入算法JAVA实现
- The Hadoop Distributed File System
- 插件4:删除空格
- ASCII 码的规律技巧
- MFC笔记——消息响应
- msgsnd与msgrcv函数出现invalid参数的问题
- php file_get_contents
- 做个有责任感的人
- IT人员必学最基础知识(一)——总括
- mod运算
- 程序员面试题精选--树为另一树的子结构
- 应用jBPM4解决中国特色的流程需求
- SELinux导致的samba匿名访问配置问题
- 如何编写一个完整全面的测试用例