MSGCTL(3)

명칭
msgctl - 메세지 제어 오퍼레이션

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/ipc.h> <sys/msg.h> int msgctl(int msqid, int cmd, struct msqid_ds *buf)

해설
msgctl() 시스템 콜은, msqid 하지만 지정하는 메시지 큐에 대해서 제어 오퍼레이션을 실행합니다.

각 메시지 큐에는, 거기에 관련한 데이터 구조체가 있습니다. 그 일부는 msgctl() 그리고 변경할 수 있습니다. msgctl() 의 액션을 결정하는 데이터 구조도 있습니다. 이 데이터 구조체는 <sys/msg.h> 그리고 정의되어 이하와 같은 멤버가 포함되어 있습니다 (그 외의 멤버도 있습니다).

    struct msqid_ds {
            struct  ipc_perm msg_perm; /* 메시지 큐의 퍼미션 비트 */
            struct  msg *msg_first; /* 큐의 최초의 메세지 */
            struct  msg *msg_last; /* 큐의 마지막 메세지 */
            u_long  msg_cbytes; /* 큐로 사용하고 있는 바이트수 */
            u_long  msg_qnum; /* 큐로 사용하고 있는 메세지수 */
            u_long  msg_qbytes; /* 큐로 사용하는 최대 바이트수 */
            pid_t   msg_lspid; /* 마지막 msgsnd 의 프로세스 ID  */
            pid_t   msg_lrpid; /* 마지막 msgrcv 의 프로세스 ID  */
            time_t  msg_stime; /* 마지막 msgsnd 의 시간  */
            long    msg_pad1;
            time_t  msg_rtime; /* 마지막 msgrcv 의 시간  */
            long    msg_pad2;
            time_t  msg_ctime; /* 마지막 msgctl 의 시간  */
            long    msg_pad3;
            long    msg_pad4[4];
        };

shmid_ds 구조체 중(안)에서 사용된다 ipc_perm 구조체는, <sys/ipc.h> 그리고 이하와 같이 정의되고 있습니다.

    struct ipc_perm {
            ushort  cuid;   /* 생성자의 유저 ID */
            ushort  cgid;   /* 생성자의 그룹 ID */
            ushort  uid;    /* 유저 ID */
            ushort  gid;    /* 그룹 ID */
            ushort  mode;   /* r/w 퍼미션 */
            ushort  seq;    /* 순차 순서 번호 (일의에 생성된 msg/sem/shm ID) */
            key_t   key;    /* 유저가 지정한 msg/sem/shm 키 */
    };

msgctl() 하지만 실행하는 오퍼레이션은, 이하 중 1 개로 cmd 그리고 지정됩니다.

IPC_STAT
    메시지 큐의 정보를 모아 buf 하지만 가리키는 구조체에 배치합니다.

IPC_SET
    msqid 에 관련하는 구조체의 msg_perm.uid 필드, msg_perm.gid 필드, msg_perm.mode 필드, msg_qbytes 필드의 값을 설정합니다. 이 값은, buf 하지만 가리키는 구조체로 대응하는 필드로부터 놓칩니다. 이 오퍼레이션을 실행할 수 있는 것은, 슈퍼 유저, 또는 메시지 큐에 관련한다 데이터 구조체의 msg_perm.cuid 인가 msg_perm.uid (와)과 동일한 실효 유저 ID 를 가지는 프로세스만입니다. msg_qbytes 의 값을 늘릴 수 있는 것은, 슈퍼 유저만입니다. 시스템 제한 ( <sys/msg.h> 의 MSGMNB)를 넘었다 msg_qbytes 의 값은, 그 제한으로 잘라 버릴 수 있습니다.

IPC_RMID
    msqid 하지만 지정하는 메시지 큐를 삭제해, msqid 에 관련한다 데이터를 파괴합니다. 슈퍼 유저, 또는, 큐에 관련하는 데이터 구조체의 msg_perm.cuid 또는 msg_perm.uid 의 값이, 실효 유저 ID 에 동일한 프로세스만이, 이것을 실행할 수 있습니다.

메시지 큐로부터의 독포함권이나 메시지 큐에의 기록권 ( msgsnd(3) (와)과 msgrcv(3) 참조)는, 파일과 같이 ( chmod(2) 참조), msg_perm.mode 필드에 의해 정해집니다. 실효 유저 ID 는, msg_perm.cuid 필드인가 msg_perm.uid 필드와 일치해, 실효 그룹 ID 는, msg_perm.cgid 인가 msg_perm.gid (와)과 일치합니다.

반환값

에러
msgctl() (은)는, 이하와 같은 경우에 에러가 됩니다.

[EPERM]
    cmd 하지만 IPC_SET 나 IPC_RMID 와 동일하고, 소환측이 슈퍼 유저가 아닌 경우. 또는 실효 유저 ID 가 메시지 큐에 관련하는 데이터 구조의 msg_perm.uid 필드인가 msg_perm.cuid 필드와 일치하지 않는 경우.

    IPC_SET 를 이용해 msg_qbytes 의 값을 올리려고 했지만, 소환측이 슈퍼 유저가 아닌 경우.

[EACCES]
    명령이 IPC_STAT 이지만, 이 메시지 큐의 독포함권이 소환 측에 없는 경우.

[EINVAL]
    msqid 하지만 올바른 메시지 큐 ID 가 아닌 경우.

    cmd 하지만 올바른 명령이 아닌 경우.

[EFAULT]
    buf 하지만 올바른 주소를 지정하고 있지 않는 경우.

관련 항목
msgget(3), msgrcv(3), msgsnd(3)

역사
메시지 큐는, AT&T UNIX 의 최초의 릴리스에 추가되었습니다.