MSGOP(2)

이름
msgop - 메세지 작동들

사용법
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>

int msgsnd ( int msqid, struct msgbuf *msgp, int msgsz, int msgflg )

int msgrcv ( int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg )

설명
메세지를 보내고 받기 위해서, 호출 프로세스는 다음과 같은 구조체를 할당해야 한다.

    struct msgbuf {
    long    mtype;
/* 메세지 타입, 0 보다 커야 한다 */
    char    mtext[1];
/* 메세지 데이터 */
    };

그러나 배열 mtext 가 가지고 있는 msgsz의 크기는 양수 값이어야 한다. 구조체 멤버 mtype 은 호출 프로세스가 메세지 선택을 위해 사용할수 있도록 확실히 양수값이어야 한다. ( msgrcv를 참조해라).

호출 프로세스는 큐에 있는 메세지를 보내기 위해 쓰기 접근을 가지고 있어야 하며 메세지를 받기 위해 읽기 허가권을 가지고 있어야 한다.

msgsnd 시스템 콜은 msgp 인자가 가리키고 있는 메세지의 복사본을 식별자가 msqid 인자 값인 메세지 큐에 넣는다.

msgflg 인자는 들어온 새 메세지가 만일 큐에서 msg_qbytes 이상을 요구한다면 시스템 콜의 행동을 지정한다. IPC_NOWAIT 가 명시되었다면 메세지는 보내지지 않으며 시스템 콜은 errno 를 EAGAIN으로 설정하고 실패를 리턴한다. 만약 그렇지 않으면 프로세스는 중지상태가 더이상 존재하지 않을때까지나(메세지가 보내지고 시스템 호출이 성공했을 경우), 큐가 제거되었거나(시스템 호출이 errno 를 EIDRM로 설정하고 실패했을 경우), 프로세스가 신호를 받을때까지 일시 중지된다(시스템 호출이 errno 를 EINTR로 설정하고 실패했을 경우).

성공시 메세지 큐 데이터 구조는 다음과 같이 갱신된다:

    msg_lspid 는 호출 프로세스의 프로세스-ID로 설정된다.

    msg_qnum 는 1 증가한다.

    msg_stime 는 현재 시간으로 설정된다.

msgrcv 시스템 호출은 msqid 가 가리키는 메세지 큐에서 메세지를 읽어서 msgp 인자가 가리키는 msgbuf 로 복사하며, 성공시 메세지 큐에서 읽은 해당 메세지는 삭제된다.

인자 msgsz 는 msgp 인자가 가리키는 구조체에서 mtext 멤버의 최대 크기 바이트를 가리킨다. 메세지 텍스트가 msgsz보다 큰 길이를 가지고 msgflg 인자에 MSG_NOERROR가 명시되어 있다면 메세지 텍스트는 잘린다(그리고 잘려진 부분을 잃는다). 만일 그렇지 않으면 메세지는 큐에서 제거 되지 않으며 시스템 콜은 errno 를 E2BIG으로 설정하고 실패를 반환한다.

인자 msgtyp 는 다음과 같은 메세지 타입을 지정한다.

    만일 msgtyp 가 0이면, 큐의 앞에 있는 메세지를 읽는다.

    만일 msgtyp 가 0보다 크고 MSG_EXCEPT 가 msgflg 인자에 의해 지정되어 있지 않다면, msgtyp 타입 큐의 처음 메세지가 읽혀진다. 만일 그렇지 않으면 msgtyp 과 같지 않은 타입의 큐에 있는 처음 메세지를 읽는다.

    만일 msgtyp 이 0보다 작다면, msgtyp 절대값보다 작거나 같은 타입의 큐에 있는 처음 메세지가 읽혀진다.

msgflg 인자는 다음과 같은 플래그중 하나도 없거나, 하나 또는 그 이상을(또는 그것들 중에서)지정한다:

    IPC_NOWAIT 요구된 타입의 메세지가 큐에 없다면 즉시 리턴한다. 시스템 콜은 errno를 ENOMSG으로 설정하고 실패한다.

    MSG_EXCEPT msgtyp과 다른 메세지 타입을 가지고 있는 큐의 처음 메세지를 읽기 위해 0 보다 큰 msgtyp 을 사용한다.

    MSG_NOERROR msgsz 바이트보다 크다면 메세지 텍스트를 자른다.

만일 요구된 타입의 메세지를 이용할수 없으며 IPC_NOWAIT 가 msgflg에 지정되어 있지 않다면, 호출 프로세스는 다음 조건중 하나가 일어날때까지 블럭 된다.

    원하는 타입의 메세지가 큐에 있다.

    메세지 큐는 시스템에서 제거 되었다. 그런 경우 시스템 호출은 errno 를 EIDRM으로 설정하고 실패한다.

    호출 프로세스가 잡을 수 있는 신호를 받았다. 그런 경우 시스템 호출은 errno 를 EINTR으로 설정하고 실패한다.

성공시, 메세지 큐 데이터 구조는 다음과 같이 갱신된다:

    msg_lrpid 는 호출 프로세스의 프로세스-ID로 설정된다.

    msg_qnum 는 1 감소한다.

    msg_rtime 는 현재 시간으로 설정된다.

반환값
실패시 두함수 모두 -1 을 리턴한다. errno 는 에러를 가리킨다. 만일 그렇지 않으면 msgsnd 는 0 을 반환하며 msgrvc 는 mtext 배열로 실제로 복사된 바이트수를 반환한다.

에러
msgsnd 가 실패하면, 반환시 errno 는 다음중 하나로 설정된다.

EAGAIN
    메세지를 큐의 msg_qbytes 제한 값 때문에 보낼수 없다. 그리고 IPC_NOWAIT 는 mgsflg인자에 지정되어 있다.

EACCES
    호출 프로세스는 메세지 큐에 쓰기 접근 허가권을 가지고 있지 않다.

EFAULT
    msgp 가 가리키고 있는 주소를 접근할수 없다.

EIDRM
    메세지 큐가 제거 되었다.

EINTR
    모든 메세지 큐가 잠든 상태일때 프로세스가 잡을수 있는 신호를 받았다.

EINVAL
    유효하지 않은 msqid 값이나 음수의 mtype 값이나, 유효하지 않은 msgsz 값(0보다 작거나 시스템 값 MSGMAX보다 클 경우).

ENOMEM
    시스템이 제공된 msgbuf에 복사할 충분한 메모리를 가지고 있지 않다.

msgrcv 가 실패할때, 반환시 errno 는 다음 값중 하나로 설정된다.

E2BIG
    메세지 텍스트 길이가 msgsz 보다 크고 MSG_NOERROR 가 msgflg에 지정되어 있지 않다.

EACCES
    호출 프로세스가 메세지 큐에 대한 읽기 접근 허가권을 가지고 있지 않다.

EFAULT
    msgp 가 가리키고 있는 주소를 접근할수 없다.

EIDRM
    프로세스가 메세지를 받기 위해 잠든 동안, 메세지 큐가 제거 되었다.

EINTR
    프로세스가 메세지를 받기 위해 잠든 동안, 프로세스가 잡을수 있는 신호를 받았다.

EINVAL
    유효하지 않은 msgqid 값이나, msgsz 가 0보다 작다.

ENOMSG
    IPC_NOWAIT 가 msgflg 에 지정되어 있고 요청된 타입의 메세지가 메세지 큐에 존재하지 않는다.

주의
다음은 msgsnd 시스템 콜에 영향을 주는 시스템 제한값들이다:

MSGMAX
    메세지 텍스트의 최대 크기: 수행시 이 값은 4080 bytes로 설정된다.

MSGMNB
    메세지 큐의 기본 최대 크기: 정책에 의존적이며, 슈퍼-유저는 msgctl 시스템 호출로 메세지 큐의 크기를 MSGMNB 이상으로 증가시킬수 있다.

수행은 메세지 헤더의 시스템 전역 최대 수 (MSGTQL) 와 메세지 풀 (MSGPOOL) 의 시스템 전역 최대 크기를 위한 어떤 내부적 제한값을 가지고 있지 않다.

호환
SVr4, SVID.

관련 항목
ipc(5), msgctl(2), msgget(2), msgrcv(2), msgsnd(2)

역자
정강훈 <skyeyes@soback.kornet.net>, 2000년 6월 24일