Unix에서의 interporcess의 통신에는
여러가지가 있다.
그 대표적인 것으로,
pipes or FIFOS,
message queues
semaphores
shared memory
sockets
streams이 있다.
그 중에서 Message Queues에 대해서 알아보자
ipcs -q로, kernel에 존재하는 Message Queues를 확인할 수 있다.
msgget으로 새로운 큐가 생성되거나, 존재하는 큐를 획득할 수 있다.
msgsnd로 의해 발생한 새로운 메세지는 queue의 끝에 추가된다
msgrcv로 의해 메세지를 first-in, first-out order로 fetch된다.
MSGMAX, 2048bytes the size of the largest message.
MSGMNB, 4096bytes the maximum size of a particular queue
MSGMNI, 50 the maximum number of messages queues.
MSGTQL, 40 the maximum number of messages
msgflag는 octal integer이고 Queue's permission and control flags이다
IPC_CREAT
IPC_EXCL
만 사용가능
IPC_EXCL지정후, IPC structure가 이미 존재할 경우, EEXIST에러발생
msgget
실패시, -1
성공시, nonnegative message queue ID
이 id는 다른 함수에서 사용할 수 있다.
send쪽에서는 msgget(key, IPC_CREAT | 0666);으로 하고
recv쪽에서는 msgget(key, 0666)으로 한다.
그리고, send를 하면, kernel의 message queue에 메세지로 저장되고,
그 메세지를 msgrcv로 얻어온다.
cmd
IPC_STAT; 큐의 속성을 msqid_ds struct로 적용
IPC_SET; msg_perm.uid, msg_perm.gid, msg_perm.mod, msg_qbytes의 속성만 변경
단 실행하는 user id가 msg_perm.cuid, msg_perm.uid와 동일할때만 적용됨
IPC_RMID; message queue를 삭제,
단 실행하는 user id가 msg_perm.cuid, msg_perm.uid와 동일할때만 적용됨
ptr coontains the positive integer message type, and it is immediately followed by the message data.
flag는 IPC_NOWAIT
만약, queue가 full일 경우, EAGAIN이라는 에러를 발생시키고.
msgrcv에서
flag를 IPC_NOWAIT로 할 경우, message를 기다리지 않는다.
그러나, 0으로 설정할 경우, 만약 queue에 message를 없을 경우, message를 기다린다.
msgsnd에서는 IPC_NOWAIT로 하나 0으로 하나 변화없음.
msgrcv; retrieve messages from a queue
성공시 size of data portion of message
실패시, -1
type ==0 the first message on the queue is returned. (first-in, first-out)
type > 0 the first message on the queue whose message type equals type is returned.
type < 0 the first message on the queue whose message type is the lowest value less than or equal to the absolute value of type is returned.
여러가지가 있다.
그 대표적인 것으로,
pipes or FIFOS,
message queues
semaphores
shared memory
sockets
streams이 있다.
그 중에서 Message Queues에 대해서 알아보자
ipcs -q로, kernel에 존재하는 Message Queues를 확인할 수 있다.
msgget으로 새로운 큐가 생성되거나, 존재하는 큐를 획득할 수 있다.
msgsnd로 의해 발생한 새로운 메세지는 queue의 끝에 추가된다
msgrcv로 의해 메세지를 first-in, first-out order로 fetch된다.
MSGMAX, 2048bytes the size of the largest message.
MSGMNB, 4096bytes the maximum size of a particular queue
MSGMNI, 50 the maximum number of messages queues.
MSGTQL, 40 the maximum number of messages
Initialising the Message Queue
#include < sys/types.h > #include < sys/ipc.h> #include < sys/msg.h>
int msgget(key_t key, int msgflag);
msgflag는 octal integer이고 Queue's permission and control flags이다
IPC_CREAT
IPC_EXCL
만 사용가능
IPC_EXCL지정후, IPC structure가 이미 존재할 경우, EEXIST에러발생
msgget
실패시, -1
성공시, nonnegative message queue ID
이 id는 다른 함수에서 사용할 수 있다.
send쪽에서는 msgget(key, IPC_CREAT | 0666);으로 하고
recv쪽에서는 msgget(key, 0666)으로 한다.
그리고, send를 하면, kernel의 message queue에 메세지로 저장되고,
그 메세지를 msgrcv로 얻어온다.
Controlling message queues
msgctl(int msqid, int cmd, struct msqid_ds *buf)
cmd
IPC_STAT; 큐의 속성을 msqid_ds struct로 적용
IPC_SET; msg_perm.uid, msg_perm.gid, msg_perm.mod, msg_qbytes의 속성만 변경
단 실행하는 user id가 msg_perm.cuid, msg_perm.uid와 동일할때만 적용됨
IPC_RMID; message queue를 삭제,
단 실행하는 user id가 msg_perm.cuid, msg_perm.uid와 동일할때만 적용됨
Sending and Receiving Messages
msgsnd(int msqid, const void *ptr, size_t nbytes, int flag);msgsnd에 의해 메세지를 message queue에 놓인다
ptr coontains the positive integer message type, and it is immediately followed by the message data.
struct mymesg{ long mtype; // positive message type char mtext[512]; // message data, of length nbytes };
flag는 IPC_NOWAIT
만약, queue가 full일 경우, EAGAIN이라는 에러를 발생시키고.
msgrcv에서
flag를 IPC_NOWAIT로 할 경우, message를 기다리지 않는다.
그러나, 0으로 설정할 경우, 만약 queue에 message를 없을 경우, message를 기다린다.
msgsnd에서는 IPC_NOWAIT로 하나 0으로 하나 변화없음.
msgrcv(int msqid, void *ptr, size_t nbytes, long type, int flag);
msgrcv; retrieve messages from a queue
성공시 size of data portion of message
실패시, -1
type ==0 the first message on the queue is returned. (first-in, first-out)
type > 0 the first message on the queue whose message type equals type is returned.
type < 0 the first message on the queue whose message type is the lowest value less than or equal to the absolute value of type is returned.
Comments