AIX下需要提供服务器的API对外开放,已实现其他应用程序的调用,但是服务器程序并不是静态的,不可能通过库的包装等方式提供函数API,因此想到了使用消息队列,而且消息队列的MsgBuf的结构体形式也符合调用时的需要,消息类型和消息体分别对应了通信的命令请求以及命令请求的内容。
在实现的过程成遇到了问题,但是最终都解决了,现在写出来供我们一起分享,以免我们做无用功。
1.msgget
一开始使用的是IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR作为参数常见的消息ID,并且通过判断errno是否为EEXIST的方式决定参数是否需要改为S_IRUSR|S_IWUSR,但是在执行的过程中总是出现偶尔的“创建消息队列失败”的错误,后来直接改为了IPC_CREAT|S_IRUSR|S_IWUSR,执行成功。
2.msgsnd
发送的时候传递的MessageSize参数传递的是你自己定义的消息结构体中的mtext的长度。
3.msgrcv
接收的时候传递的MessageSize参数传递的是整个消息结构体的size,
注意:在msgsnd和msgrcv中传递的参数要保证正确,否则会出现Invalid Argument的错误
注意系统有个默认的MsgBuf结构体:在sys/msg.h(AIX下面的全路径是/usr/include/sys/msg.h)
- struct msgbuf {
- mtyp_t mtype; /* message type */
- char mtext[1]; /* message text */
- };
其中的mtyp_t是个数据类型定义:
- typedef long mtyp_t; /* ipc message type */
这个数据类型定义在sys/types.h文件中。
4.如果消息体的内容需要是结构体:
此时要注意结构体内部的字节对齐,AIX下面在C++文件和C文件中对long的size定义就不同,前者占用8个byte,而后者则是4个byte。而且AIX下面C的结构体不是按照起始地址为自己占用字节数的倍数偏移的,这个我们可以通过自己设置结构体编写程序测试查看。但是系统为我们提供了宏定义
可以设置结构体内部的字节对齐方式,我采用的是
这样在发送方和接收方直接将结构体地址强制转换为char *,并作为消息内容赋值给消息结构体中的mtext字符数组名。
char a[len],在C++中需要确保len是个常量,否则会出现编译时错误。而且要注意strcpy和memcpy的使用。
阅读(3881) | 评论(0) | 转发(0) |