Chinaunix首页 | 论坛 | 博客
  • 博客访问: 746193
  • 博文数量: 96
  • 博客积分: 2023
  • 博客等级: 上尉
  • 技术积分: 1738
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-15 10:03
文章分类

全部博文(96)

文章存档

2014年(11)

2012年(85)

分类: 系统运维

2012-05-17 09:57:04

  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)

点击(此处)折叠或打开

  1. struct msgbuf {
  2.     mtyp_t    mtype;        /* message type */
  3.     char    mtext[1];    /* message text */
  4. };
其中的mtyp_t是个数据类型定义:

点击(此处)折叠或打开

  1. typedef long        mtyp_t;        /* ipc message type */


这个数据类型定义在sys/types.h文件中。

  4.如果消息体的内容需要是结构体

此时要注意结构体内部的字节对齐,AIX下面在C++文件和C文件中对long的size定义就不同,前者占用8个byte,而后者则是4个byte。而且AIX下面C的结构体不是按照起始地址为自己占用字节数的倍数偏移的,这个我们可以通过自己设置结构体编写程序测试查看。但是系统为我们提供了宏定义

点击(此处)折叠或打开

  1. #pragma PACK (X)


可以设置结构体内部的字节对齐方式,我采用的是

点击(此处)折叠或打开

  1. #pragma PACK (1)


这样在发送方和接收方直接将结构体地址强制转换为char *,并作为消息内容赋值给消息结构体中的mtext字符数组名。

  char a[len],在C++中需要确保len是个常量,否则会出现编译时错误。而且要注意strcpy和memcpy的使用。

阅读(3826) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~