본문 바로가기
한국으로/임베디드 리눅스

3.4 메시지 큐

by 영킴. 2018. 6. 27.

3.4 메시지 큐

3.4.1 개요

프로세스 간 자료 교환하기

메시지 큐에 연결된 프로세스들은 메시지를 서로 보내고 받을 수 있다.

메시지 큐는 커널 영역에 존재.
프로세스는 유저 영역에 존재.

소량의 데이터를 간단히 보낼 때 메시지 큐를 사용하자!
메시지 큐는 동기화 문제가 없기 때문에 간단히 구현할 수 있다.
반대로 공유 메모리는 대량의 데이터를 주고받을 때 사용한다.



3.4.2 메시지 큐 함수

int msgget(key_t key, int msgflg);

기능: 메시지 큐 생성
리턴: 성공 시 메시지 큐 ID, 실패 시 errno 설정 후 -1 리턴
key: 메시지 큐 접근 키
msgflg:  IPC_CREAT (메시지 큐가 없으면 새로 생성), IPC_CREAT | IPC_EXCL (메시지 큐가 있으면 에러)


int msgctl(int msqid, int cmd, struct msqid_ds* buf);

기능: 메시지 큐 제어
리턴: 성공 시 cmd 리턴값, 실패 시 errno 설정 후 -1 리턴
msqid: 메시지 큐 ID
cmd: IPC_STAT(메시지 큐 정보를 buf에 저장), IPC_RMID(메시지 큐 제거)

buf: msqid_ds


int msgsnd(int msqid, const void* msgp, size_t msgsz, int msgflg);

기능: 메시지 큐에 메시지 보내기
리턴: 성공 시 0, 실패 시 errno 설정 후 -1 리턴
msqid: 메시지 큐 ID
msgp: msg_buf 구조체를 가리킴, mtype 0 이상의 값은 필수
msgz: mtype (4B) 크기를 제외한 크기
msgflg: msgsnd()는 큐에 충분한 공간이 없다면 잠듦. IPC_NOWAIT인 경우 잠들지 않고 즉시 에러 리턴

int msgrcv(int msqid, void* msgp, size_t msgsz, long msgtyp, int msgflg);

기능: 메시지 큐에서 메시지 받기
리턴: 성공 시 받은 바이트 수, 실패 시 errno 설정 후 -1 리턴
msqid: 메시지 큐 ID
msgp: msg_buf 구조체를 가리킴
msgz: mtype (4B) 크기를 제외한 크기
msgtyp: 0인 경우 큐에 가장 먼저 들어온 메시지 읽기, 
0 초과인 경우 mtype과 같은 메시지 중 가장 먼저 들어온 메시지 읽기,
0 미만인 경우 mtype이 msgtyp의 절대값보다 작거나 같은 메시지 중 가장 작은 mtype의 메시지 읽기
msgflg: msgrcv()는 큐에서 원하는 메시지가 없다면 생길 때까지 잠듦. IPC_NOWAIT인 경우 잠들지 않고 즉시 에러 리턴


'한국으로 > 임베디드 리눅스' 카테고리의 다른 글

5.2 시스템 콜  (0) 2018.06.28
5.1 프로세스 관리  (0) 2018.06.28
4.2 스레드 동기화  (0) 2018.06.28
4.1 스레드란?  (0) 2018.06.27
3.3 공유 메모리  (0) 2018.06.27
3.2 세마포어  (0) 2018.06.27
3.1 파이프  (0) 2018.06.27
2.2 시그널  (0) 2018.06.27