为了从其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;
}
有人可以帮我理解我做错了什么......
答案 0 :(得分:0)
我已经解决了这个问题,它是“msg.c”函数“sys_msgctl()”中的指令“copy_to_user()”:它显然无法在内核空间中正常工作,因为用户空间寻址不同;我通过创建另一个基于“sys_msgctl()”的函数来绕过这个问题,该函数在输入中只接受“msqid”并返回元素的数量......正是我需要的!
感谢所有人