MSGSND(3)

명칭
msgsnd

프로그램 라이브러리
libc - 메시지 큐에 메세지를 송신

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

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

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

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

메시지 큐에 벌써 존재하는 바이트수와 msgsz 의 합계가, 메시지 큐의 최대 바이트수 (msg_qbytes msgctl(3) 참조)보다 큰 경우, 또는 시스템 전체의 모든 큐에 존재한다 메세지수가 시스템 제한으로 벌써 동일해지고 있는 경우는, msgflg 하지만 msgsnd() 의 동작을 결정합니다. msgflg 그리고 IPC_NOWAIT 마스크가 설정되어 있는 경우, 호출은 곧바로 되돌려집니다. msgflg 그리고 IPC_NOWAIT 하지만 설정되어 있지 않은 경우, 소환은 이하 상태가 될 때까지 블록 됩니다.

•   소환이 블록 되는 조건이 없어질 때까지. 이 조건이 없어지면(자), 메세지가 송신됩니다.

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

•   호출측이 시그널을 수신할 때까지. 호출은, errno 하지만 EINTR (으)로 설정된 상태로 돌아옵니다.

호출로 문제가 발생하지 않았던 경우, 메시지 큐에 관련한다 데이터 구조는 이하와 같이 갱신됩니다.

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

•   msg_qnum 에 1 이 더해집니다.

•   msg_lspid 하지만 호출 프로세스의 프로세스 ID 로 설정됩니다.

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

반환값

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

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

    리소스를 사용할 수 있게 되어, 메세지를 송신할 수 있다 상태가 되는 것을 msgsnd() 하지만 기다리고 있는 동안에, 메시지 큐가 삭제되었을 경우.

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

    mtype 하지만 0 보다 크지 않은 경우.

[EACCES]
    소환 프로세스에 메시지 큐의 기록권이 없는 경우.

[EAGAIN]
    큐나 시스템 전체에 메세지용의 스페이스가 없고, msgflg 그리고 IPC_NOWAIT 하지만 설정되어 있는 경우.

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

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

버그
NetBSD (와)과 FreeBSD (은)는, 메시지 큐가 삭제되었을 경우에 사용해야 할 에러치 EIDRM (을)를 정의하고 있지 않습니다.

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