huangaiyuan 发表于 2015-02-14 13:08

msgctl参数匹配问题,搞不懂?

本帖最后由 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;
};

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));
}

lxy572535121 发表于 2015-02-14 14:29

你的源代码中根本就没有用到struct msginfo 结构体
在你的源代码中buf的类型是structmsqid_ds类型的,当然&buf能作为msgctl函数的第三个参数

huangaiyuan 发表于 2015-02-14 16:11

太不好意思了,被我改掉了,我忘记改回去了!
回复 2# lxy572535121


   

羽剑天涯 发表于 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.Thisstructureisoftypemsginfo(thus,acastis
            required), defined in <sys/msg.h> if the _GNU_SOURCE feature test macro is defined:
……
特别提到,这里需要类型转换,也就是
msgctl(msgid, MSG_INFO, (struct msqid_ds *)&buf);
页: [1]
查看完整版本: msgctl参数匹配问题,搞不懂?