MSGRCV(3)

명칭
msgrcv - 메시지 큐로부터 메세지를 수신

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/ipc.h> <sys/msg.h> int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)

해설
msgrcv() 함수는, msqid 그리고 지정한 메시지 큐로부터 메세지를 수신해, msgp 하지만 가리키는 구조체에 배치합니다. 이 구조체는, 이하의 멤버로부터 구성되어 있을 필요가 있습니다.

        long mtype;    /* 메세지 타입 */
        char mtext[1]; /* 메세지 본체 */

mtype (은)는 0 보다 큰 정수로, 메세지의 선택에 사용됩니다. mtext (은)는 바이트의 배열로, 시스템 제한 (MSGMAX) 까지의 사이즈입니다.

msgtyp 의 값에는 이하와 같은 의미가 있습니다.

•   msgtyp 하지만 0 보다 큰 경우, 타입이 msgtyp 인 최초의 메세지가 수신됩니다.

•   msgtyp 하지만 0 으로 동일한 경우, 큐의 최초의 메세지가 수신됩니다.

•   msgtyp 하지만 0 보다 작은 경우, 최저 메세지 타입이 msgtyp 의 절대치 이하인 메세지 중 최초의 것이 수신됩니다.

msgsz (은)는, 요구한 메세지의 최대장을 지정합니다. 수신한 메세지가 msgsz 보다 긴 경우, msgflg 그리고 MSG_NOERROR 플래그가 설정되어 있으면(자), 메세지는 에러 통지없이 잘라 버릴 수 있습니다. MSG_NOERROR 플래그가 설정되어 있지 않으면 에러가 되돌려집니다.

msqid 하지만 지정하는 메시지 큐에, 일치하는 메세지가 존재하지 않는 경우, msgrcv() 의 동작은, msgflg 그리고 IPC_NOWAIT 플래그가 설정되어 있는지 어떤지에 의해 정해집니다. IPC_NOWAIT 하지만 설정되어 있으면(자), msgrcv() (은)는 곧바로 -1 를 되돌려, errno (을)를 EAGAIN (으)로 설정합니다. IPC_NOWAIT 하지만 설정되어 있지 않으면 호출 프로세스는, 이하 상태가 될 때까지 블록 됩니다.

•   요구된 타입의 메세지가 메시지 큐로 사용할 수 있게 될 때까지.

•   메시지 큐가 삭제될 때까지. 이 경우는 -1 이 되돌려져 errno 하지만 EINVAL (으)로 설정됩니다.

•   시그널이 수신될 때까지. 이 경우는 -1 이 되돌려져 errno 하지만 EINTR (으)로 설정됩니다.

메세지가 문제 없게 수신되면(자), msqid 에 관련하는 데이터 구조체는, 이하와 같이 갱신됩니다.

•   msg_cbytes 하지만, 그 메세지의 사이즈만 작아집니다.

•   msg_lrpid 하지만, 소환측의 프로세스 ID 로 설정됩니다.

•   msg_lrtime 하지만, 현재의 시각으로 설정됩니다.

•   msg_qnum (으)로부터 1 이 끌립니다.

반환값
문제 없게 종료하면(자), msgrcv() (은)는, msgp 하지만 가리키는 구조체의 mtext 필드에 수신한 바이트수를 되돌립니다. 문제 없게 종료하지 않는 경우 -1 가 되돌려져 errno 하지만 그 에러를 나타내도록(듯이) 설정됩니다.

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

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

    요구된 타입의 메세지를 사용할 수 있게 되는 상태를 msgrcv() 하지만 기다리고 있는 동안에 메시지 큐가 삭제되었을 경우.

    msgsz 하지만 0 보다 작은 경우.

[E2BIG]
    일치하는 메세지가 수신되었지만, 사이즈가 msgsz 보다 크고, msgflg 그리고 MSG_NOERROR 플래그가 설정되어 있지 않은 경우.

[EACCES]
    호출 프로세스에, 메시지 큐의 독포함권이 없는 경우.

[EFAULT]
    msgp 하지만, 올바른 주소를 가리키지 않은 경우.

[EINTR]
    시스템 콜이, 시그널의 배송에 의해 끼어들어졌을 경우.

[EAGAIN]
    요구된 타입의 메세지가 메시지 큐에 없고, msgflg 그리고 IPC_NOWAIT 하지만 설정되어 있는 경우.

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

버그
NetBSD (와)과 FreeBSD 그럼, 메시지 큐가 삭제되었을 경우에 사용해야 할 에러치 EIDRM 하지만 정의되고 있지 않습니다. 또, 이용 가능한 메세지가 없는 상태로 IPC_NOWAIT 하지만 설정되어 있는 경우에 사용해야 할 에러치 ENOMSG 하지만 정의되고 있지 않습니다.

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