免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3448 | 回复: 3
打印 上一主题 下一主题

[Linux] msgctl参数匹配问题,搞不懂? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-14 13:08 |只看该作者 |倒序浏览
本帖最后由 huangaiyuan 于 2015-02-14 16:10 编辑

我们使用msgctl函数来读取消息队列的信息,用法如下:
struct msginfo buf;      
msgctl(msgid,MSG_INFO,&buf);
但是msgctl函数的原型是int msgctl(int __msqid, int __cmd, struct msqid_ds * __buf);
第三个参数类型是msqid_ds, 但是buf是msginfo类型的引用?可以这样用吗?

源代码如下:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<string.h>
#include<sys/msg.h>
#define BUFSIZE 128
struct msg_buf
{
        long type;
        char msg[BUFSIZE];
};

int main(int argc,char *argv[])
{
        key_t key;
        int msgid;
        struct msg_buf msg_snd,msg_rcv;
        struct msqinfo buf;
        char *ptr="helloworld";

        memset(&msg_snd,'\0',sizeof(struct msg_buf));
        memset(&msg_rcv,'\0',sizeof(struct msg_buf));

        msg_rcv.type=1;

        msg_snd.type=1;
        memcpy(msg_snd.msg,ptr,strlen(ptr));
        if((key=ftok(".",'A'))==-1)
        {
                perror("ftok");
                exit(EXIT_FAILURE);
        }

        if((msgid=msgget(key,0600|IPC_CREAT))==-1)
        {
                perror("msgget");
                exit(EXIT_FAILURE);
        }
        printf("msgsnd_return=%d\n",msgsnd(msgid,(void *)&msg_snd,strlen(msg_snd.msg),0));

        msgctl(msgid,MSG_INFO,&buf);
        printf("buf.msgmax=%d\n",buf.msgmax);
        printf("buf.msgmnb=%d\n",buf.msgmnb);
        printf("buf.msgpool=%d\n",buf.msgpool);
        printf("buf.semmap=%d\n",buf.msgmap);
        printf("buf.msgmni=%d\n",buf.msgmni);
        printf("buf.msgssz=%d\n",buf.msgssz);
        printf("buf.msgtql=%d\n",buf.msgtql);
        printf("buf.msgseg=%u\n",buf.msgseg);

        printf("msgrcv_return=%d\n",msgrcv(msgid,(void *)&msg_rcv,BUFSIZE,msg_rcv.type,0));
        printf("rev msg:%s\n",msg_rcv.msg);
        printf("msgctl_return=%d\n",msgctl(msgid,IPC_RMID,0));
}

论坛徽章:
6
2015年迎新春徽章
日期:2015-03-04 10:16:53操作系统版块每日发帖之星
日期:2015-08-04 06:20:002015亚冠之鹿岛鹿角
日期:2015-08-05 16:51:182015亚冠之全北现代
日期:2015-08-07 17:14:392015亚冠之武里南联
日期:2015-08-11 15:33:03数据库技术版块每日发帖之星
日期:2016-02-02 06:20:00
2 [报告]
发表于 2015-02-14 14:29 |只看该作者
你的源代码中根本就没有用到struct msginfo 结构体
在你的源代码中buf的类型是struct  msqid_ds类型的,当然&buf能作为msgctl函数的第三个参数

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2015-02-14 16:11 |只看该作者
太不好意思了,被我改掉了,我忘记改回去了!
回复 2# lxy572535121


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2015-02-14 17:09 |只看该作者
可以看一下msgctl的介绍(man msgctl):
……
IPC_INFO (Linux-specific)
              Returns information about system-wide message queue limits and parameters in the structure pointed to by buf.  This  structure  is  of  type  msginfo  (thus,  a  cast  is
              required), defined in <sys/msg.h> if the _GNU_SOURCE feature test macro is defined:
……
特别提到,这里需要类型转换,也就是
msgctl(msgid, MSG_INFO, (struct msqid_ds *)&buf);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP