컴퓨터 공부/Advanced UNIX System Programming

[5월 11일 2교시] 시스템V IPC - 메세지큐

려리군 2009. 5. 11. 11:15

스트림 : 연속된 바이트들의 흐름(바이트 단위)

메세지 : 레코드 단위의 데이터 전송(format 존재)


시스템 V IPC

 - 메세지 큐

 - 세마포어(동기화)

 - 공유메모리

인터페이스를 위한 별도의 함수 존재

동일한 namespace(input용)로 key를 이용, 식별자는 ID로 한다.


Key(키)

#include<sys/types.h>

#include<sys/ipc.h>

key_t ftok(char *pathname, char proj);

복잡한 키 값을 만들기 위해 경로명과 proj값을 이용.


메세지큐

입출력 데이터를 커널 내부에 메세지 (단일 링크드) 리스트 형태로 보관.


메세지 큐함수

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

int msgget(in:key_t key,in int msgflag);

메세지 채널을 (만들고) 연다.

ipc 채널 열기 = join

 msgflag값key가 존재하지 않을 경우 key가 존재하는 경우 
 없음errno = ENOENT 기존 채널 ID 리턴 
 IPC_CREAT새 채널 ID 리턴 기존 채널 ID 리턴
 IPC_CREAT|IPC_EXCL새 채널 ID 리턴 errno = EEXIST 

int msgsnd(in:int msqid, in:const void *ptr, in:int length, in:int flag);

해당 ID의 채널에 메세지를 넣는다.

msqid : 메세지 채널 ID, ptr : 데이터 버퍼, length : 데이터 크기

flag

 - IPC_NOWAIT : 메세지 큐가 다 찼으면 errno  = EAGAIN


int msgrcv(in:int msqid, out:void *ptr, in:int length, in:long msgtype, in:int flag);

해당 ID의 채널에서 메세지를 하나 가져온다.

msqid : 메세지 채널 ID, ptr : 데이터 버퍼, length : 데이터 크기

msgtype

 - ==0 : 첫번째 메세지를 리턴(큐처럼 동작)

 - >0 : type이 같은 첫번째 메세지 리턴.

 - <0 : msgtype의 절대값보다 작거나 같은 type의 첫번째 메세지 리턴.


int msgctl(in:int msqid, in:int cmd, inout:struct msqid_ds *buff);

해당 ID 채널을 제어한다. (주로 채널을 지우는 용도로 사용)

msqid : 메세지 채널 ID

cmd

IPC_STAT : IPC의 현재 정보를 얻음.(buff out)

IPC_SET : IPC의 현재 정보를 변경.(buff in)

IPC_RMID : 해당 ID 채널을 삭제.(buff NULL)

buff : 메세지 큐 정보에 관한 구조체