1

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

誰かが私が間違っていることを理解するのを助けることができます...

4

1 に答える 1

0

私は問題を解決しました。それは「msg.c」の関数「sys_msgctl()」の命令「copy_to_user()」でした。ユーザー空間のアドレス指定が異なるため、明らかにカーネル空間では正しく動作しません。入力に「msqid」のみを取り、要素の数を返す「sys_msgctl()」に基づく別の関数を作成することで、問題を回避しました...まさに私が必要としているものです!

みんな同じようにありがとう

于 2012-08-15T18:46:48.557 に答える