/* message buffer for msgsnd and msgrcv calls */ /* msgsnd와 msgrcv 호출을 위한 메세지 버퍼 */ struct msgbuf { long mtype; /* type of message 메세지 타입 */ char mtext[1]; /* message text 메세지 내용 */ };
양수로 표현되는 메세지 타입. 반드시 양수여야 한다.
메세지 자료 자체.
주어진 메세지에 타입을 부여하는 능력은 본질적으로 단일 큐에서의 다중(multiplex) 메세지들을 수용할 능력을 부여한다. 예를 들면, 클라이언트 프로세스들은 매직번호 (magic number)를 할당받을 수 있고 이것은 서버 프로세스로 부터 보내진 메세지들에 대해 메세지 타입처럼 사용될 수 있다. 서버는 자체적으로 몇몇의 다른 번호를 사용할 수 있고, 클라이언트는 그번호로 메세지를 보내기 위해 사용할 수 있다. 또 다른 시나리오에서는 응용프로그램은 에러 메세지에 대해 메세지 타입 '1'를 요청 메세지(request message)에 대해 메세지 타입 '2'를 표시할 수 있다. 이러한 가능성은 끝이 없다.
또 다른 방법은 대개 메세지 자료 요소 (mtext)에 매우 서술적인 이름을 부여하여 현혹되지 않도록 하는 것이다. 이 필드는 꼭 문자들의 배열이여야 할 필요는 없다. 어떤 형태의 어떤 자료이든 상관없다. 이 구조는 응용프로그램 프로그래머에 의해 재정의될 수 있으므로, 필드 그 자체만으로도 실제로 완전히 마음대로이다.
struct my_msgbuf { long mtype; /* Message type 메세지 타입 */ long request_id; /* Request identifier 요청 확인자 */ struct client info; /* Client information structure 클라이언트 정보 구조 */ };
전과 같은 메세지 타입을 볼 수 있지만, 구조의 나머지는 두개의 다른 요소로 바뀌었다. 그 중 하나는 또 다른 구조체(structure)이다! 이것이 메세지 큐의 장점이다. 커널은 자료가 무엇이든 자료의 변환을 일으키지 않는다. 어떤 정보든지 보내질 수 있다.
주어진 메세지의 최대 크기에 대한 내부적인 제한은 없다. 리눅스에서는 linux/msg.h에 다음과 같이 정의되어 있다.:
#define MSGMAX 4056 /* <= 4056 */ /* max size if message (bytes) 메세지의 최대 크기 */
/* 각 메세지에 대한 한개의 메세지 구조체 */ struct msg { struct msg *msg_next; /* 큐에서의 다음 메세지 */ long msg_type; char *msg_spot; /* 메세지 내용 주소 */ short msg_ts; /* 메세지 내용 크기 */ };
/* 시스템상에서 각 큐에 대한 msqid 구조 */ struct msqid_ds { struct ipc_perm msg_perm; struct msg *msg_first; /* first message on queue 큐의 처음 메세지*/ struct msg *msg_last; /* last message in queue 큐의 마지막 메세지*/ time_t msg_stime; /* last msgsnd time 마지막으로 msgsnd가 수행된 시간*/ time_t msg_rtime; /* last msgrcv time 마지막으로 msgrcv가 수행된 시간*/ time_t msg_ctime; /* last change time 마지막으로 change가 수행된 시간*/ struct wait_queue *wwait; struct wait_queue *rwait; ushort msg_cbytes; ushort msg_qnum; ushort msg_qbytes; /* max number of bytes on queue 큐의 최대 바이트 수*/ ushort msg_lspid; /* pid of last msgsnd 마지막으로 msgsnd를 수행한 pid*/ ushort msg_lrpid; /* last receive pid 마지막으로 받은 pid*/ };
struct ipc_perm { key_t key; ushort uid; /* owner euid and egid */ ushort gid; ushort cuid; /* creator euid and egid */ ushort cgid; ushort mode; /* access modes see mode flags below */ ushort seq; /* slot usage sequence number */ };
NOTE:Richard Stevens의 UNIX Network Programming 125쪽에 이 주제에 대한 자세한 내용과 이것의 존재와 동작의 보안 이유등이 잘 설명되어 있다.
Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved
Email To:Webmaster ,
Another address
LAST UPDATE Nov 18,1997
Created Nov 17,1997