이 름
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 [AT] soback.net>, 2000년 6월 24일