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;
}
誰かが私が間違っていることを理解するのを助けることができます...