1

为了从 SysV 队列的 ID 中获取消息的数量,我在用户空间中使用了函数 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;
    }

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

4

1 回答 1

0

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

同样感谢大家

于 2012-08-15T18:46:48.557 回答