在内核空间中使用msgctl()函数

时间:2012-08-08 16:45:11

标签: kernel

为了从其ID中获取SysV队列中的消息数,我在用户空间中使用了函数msgctl(),没有任何问题(如下所示):

    main(int argc, char *argv[])
    {
      int qid;
      struct msqid_ds qstatus;

      qid=(int)atoi(argv[1]);

      if(msgctl(qid,IPC_STAT,&qstatus)<0){
    perror("msgctl failed");
    exit(1);
      }

      printf("There are %d messages for queue with ID %d\n",qstatus.msg_qnum,qid);
    }

现在,我需要在内核空间中做同样的事情,但是下面的代码不起作用(函数返回-1):

    int get_num_from_id(int qid)
    {
    struct msqid_ds qstatus;

    sys_msgctl(qid,IPC_STAT,&qstatus);

    return qstatus.msg_qnum;
    }

有人可以帮我理解我做错了什么......

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,它是“msg.c”函数“sys_msgctl()”中的指令“copy_to_user()”:它显然无法在内核空间中正常工作,因为用户空间寻址不同;我通过创建另一个基于“sys_msgctl()”的函数来绕过这个问题,该函数在输入中只接受“msqid”并返回元素的数量......正是我需要的!

感谢所有人