Manpages

이 름

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 가 명 시 되 었 다 면 메 세 지 는 보 내 지 지 않 으 며 시 스 템 콜 은 errnoEAGAIN으 로 설 정 하 고 실 패 를 리 턴 한 다 . 만 약 그 렇 지 않 으 면 프 로 세 스 는 중 지 상 태 가 더 이 상 존 재 하 지 않 을 때 까 지 나 (메 세 지 가 보 내 지 고 시 스 템 호 출 이 성 공 했 을 경 우 ), 큐 가 제 거 되 었 거 나 (시 스 템 호 출 이 errnoEIDRM로 설 정 하 고 실 패 했 을 경 우 ), 프 로 세 스 가 신 호 를 받 을 때 까 지 일 시 중 지 된 다 (시 스 템 호 출 이 errnoEINTR로 설 정 하 고 실 패 했 을 경 우 ).

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

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

msg_qnum 는 1 증 가 한 다 .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

msg_qnum 는 1 감 소 한 다 .

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

반 환 값

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

에 러

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

EAGAIN

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

EACCES

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

EFAULT

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

EIDRM

메 세 지 큐 가 제 거 되 었 다 .

EINTR

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

EINVAL

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

ENOMEM

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

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

E2BIG

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

EACCES

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

EFAULT

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

EIDRM

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

EINTR

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

EINVAL

유 효 하 지 않 은 msgqid 값 이 나 , msgsz0보 다 작 다 .

ENOMSG

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

주 의

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

MSGMAX

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

MSGMNB

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

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

호 환

SVr4, SVID.

관 련 항 목

ipc(5), msgctl(2), msgget(2), msgrcv(2), msgsnd(2)

역 자

정 강 훈 <skyeyes [AT] soback.net>, 2000년 6월 24일