0

POSIXメッセージキューのサイズを設定しようとしましたが、許可されていないようです。

msgctl()マニュアルページには次のように記載されています。

IPC_SETは、適切な特権を持つプロセス、またはmsqidに関連付けられたmsqid_dsデータ構造内のmsg_perm.cuidまたはmsg_perm.uidの値に等しい有効なユーザーIDを持つプロセスによってのみ実行できます 。適切な特権を持つプロセスのみがmsg_qbytesの値を上げることができます。

次のテストプログラムが返されます。

uid: 1324
effective uid: 1324
msgctl(msqid=8028175, IPC_SET, ...) failed 
(msg_perm.uid=1324,msg_perm.cuid=1324): Operation not permitted (errno=1)

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/msg.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

int main(int iArgC, char ** ppszArgv)
{
  printf("uid: %u\n", getuid());
  printf("effective uid: %u\n", geteuid());

  int msqid = msgget(
    IPC_PRIVATE,
    IPC_CREAT |
    S_IRGRP | S_IWGRP |
    S_IRUSR | S_IWUSR |
    S_IROTH | S_IWOTH);

  if (0 > msqid)
  {
    fprintf(stderr,
        "msgget() failed.\n");
    return EXIT_FAILURE;
  }

  {
    struct msqid_ds ds = {0};

    if (msgctl(
        msqid,
        IPC_STAT,
        &ds))
    {
      fprintf(stderr,
          "msgctl(msqid=%d, IPC_STAT, ...) failed: "
          "%s (errno=%d)\n",
          msqid,
          strerror(errno),
          errno);

      return EXIT_FAILURE;
    }

    ds.msg_qbytes = 1024*1024;

    if (msgctl(
        msqid,
        IPC_SET,
        &ds))
    {
      fprintf(stderr,
          "msgctl(msqid=%d, IPC_SET, ...) failed "
          "(msg_perm.uid=%u,"
          "msg_perm.cuid=%u): "
          "%s (errno=%d)\n",
          msqid,
          ds.msg_perm.uid,
          ds.msg_perm.cuid,
          strerror(errno),
          errno);
    }

    return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}

/* EOF */

それで、トリックは何ですか?

4

1 に答える 1

1

差出人man msgctl

msg_qbytes値をシステムパラメータMSGMNBを超えて上げるには、適切な特権(Linux:CAP_IPC_RESOURCE機能)が必要です。

私のシステムでは、MSGNMBは16 kBであり、設定しようとしている1MBをはるかに下回っています。この制限を確認しましたか?(するcat /proc/sys/kernel/msgmnb

于 2012-04-25T17:37:56.357 に答える