IPC methods of System V
Message Queue
어떤 message 데이터 구조체를 data를 queue형식으로 전송
Shared Memory
memory영역을 만들어서 공유한다. 하나만 접근할 수 있도록 semaphore로 접근 제한
Identifiers & Keys
- Idetifier : IPC 구조체를 식별하는 방식으로 nonnegative interger
- key : IPC 구조체를 생성할 때 key를 지정한다
id = xxxget(key, ...)
- HOW TO?
key를 정의한다. in a common header
Client 와 Server가 사용을 동의한다. 공유되어야 한다.
Server는 key를 사용하기 위한 새로운 IPC 구조체를 만든다
key가 이미 사용되고 있을 때 문제가 생긴다.
다른키를 사용하면 되지만, 쓰고 싶으면 지우고 써라
msg/shm get
• create new or open existing IPC structure.
IPC 구조체를 생성하거나 생성된 IPC open
• returns an IPC identifier if OK (or -1 on error with errno value)
IPC구조체를 반환 받고 데이터를 주고받는다.
msg/shm ctl
• determine status, set options and/or permissions
제어하기 위해 컨트롤에 대한 함수, 권한
• remove an IPC identifier
msg/shm op
• operate on an IPC identifier
• for example (message queue)
− add new msg to a queue (msgsnd)
− receive msg from a queue (msgrcv)
ipc_perm (IPC구조체)
struct ipc_perm {
uid_t uid; /* owner's effective user id */
gid_t gid; /* owner's effective group id */
uid_t cuid; /* creator's effective user id */
gid_t cgid; /* creator's effective group id */
mode_t mode; /* access modes */
ulong seq; /* slot usage sequence number */
key_t key; /* key */
};
Message Queues
- kernel내에 message를 다루는 linked list구조의 que 생성
- que는 identifier에 의해 구분된다.
msgget
새로운 message queue를 생성하고 존재하는 message queue open
msgsnd
message queue에 message를 추가해서 보내는
msgrcv
해당 message queue로 부터 message를 받는다
message fetching 순서는 queue의 형식으로 동작한다.
Each queue has a structure(msqid_ds) ... 간단하게
struct msqid_ds {
struct ipc_perm msg_perm;
struct msg *msg_first; /* ptr to first msg on queue */
struct msg *msg_last; /* ptr to last msg on queue */
ulong msg_cbytes; /* current # bytes on queue */
ulong msg_qnum; /* # msgs on queue */
ulong msg_qbytes; /* max # bytes on queue */
pid_t msg_lspid; /* pid of last msgsnd() */
pid_t msg_lrpid; /* pid of last msgrcv() */
time_t msg_stime; /* last-msgsnd() time */
time_t msg_rtime; /* last-msgrcv() time */
time_t msg_ctime; /* last-change time */
};
message queue를 이용해서 data를 전송할 때 struct를 message형식으로 만들어서 보낼 수 있다.
struct mymesg {
long mtype; /* positive message type */
char mtext[512]; /* message data, of length nbytes */
};
type은 꼭 필요하고 buffer를 이용해서 전송하기 때문에 buffer를 만들어서 전송한다.
send할 때 arg로 전송
Message Queue Parameters
message queue도 하나의 자원이기 때문에 제한이 있다.
최대 메세지 큐도 제한이 있다.
제한이 초과하면 block이 걸린다.
제한은 "/usr/include/linux/msg.h" header file에 define되어 있다.
"/etc/sysctl.conf" 로 조절이 가능하긴하다.
#include <sys.types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int flag);
key를 가지고 message quere를 생성한다 |
key : 유저가 설정한 key, message구분에 사용 flag : open()과 create()에 들어가는 mode |
return id / -1 |
#include <sys.types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd (int msqid, const void *ptr, size_t nbytes, int flag);
존재하는 message queue의 id로 전달하는 함수 |
msqid : id ptr : data pointer / message queue의 포인터 nbytes : type을 제외한 buffer size flag : – 0 for blocking (default) – IPC_NOWAIT for nonblocking I/O |
return 0 / -1 |
#include <sys.types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgrcv (int msqid, void *ptr, size_t nbytes, long msgtype, int flag);
message queue에서 data 받는 |
msqid : message queue id ptr : buffer 포인터 nbytes : buffer 크기 msgtype : message type (아래 참고) flag : – 0:default (blocked when no message) – IPC_NOWAIT: return if no message |
return 0 / -1 |
msgtype
== 0 : 현재 message queue에서 가장 첫번째를 가져간다. //뭐든 가져가가ㅔㅅ따
> 0 : 처음부터 탐색하다가 동일한 message type을 꺼내간다
< 0 : 가장 낮은 값을 가져간다.
#include <sys.types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
해당 message queue에 대한 속성정보 or 제거하는 제어함수 |
msqid : message queue id cmd : queue 명령어 // 담아서 실행 buf : msqid_ds structure에 대한 pointer |
return 0 / -1 |
commands
- IPC_STAT : 유저로 가져온다
- IPC_SET : 반대로 쓴다 정보를 넣어준다.
- IPC_RMID : message queue id를 제거한다. 다른 process에서 사용하고 있으면 모두 다 깨운다.
ipcs command
정보를 command 상태 shell에서 확인할 수 있는 방법들
ipcs : System V IPC resource 상태를 확인
$ ipcs //IPC 정보를 확인 (q,m,s 모두)
$ ipcs -q //Message Queue 정보를 확인
$ ipcs -m //Shared Memory 정보를 확인
$ ipcs -s //Semaphore 정보를 확인
ipcrm : 생성된 IPC resource를 제거
$ ipcrm -q id //Message Queue를 제거
$ ipcrm -m id //Shared Memory를 제거
$ ipcrm -s id //Semaphore를 제거
mymessage.h
crecv.c
csend.c
'시스템 프로그래밍' 카테고리의 다른 글
시스템 프로그래밍 13장 - Network (0) | 2020.06.18 |
---|---|
시스템 프로그래밍 12장 - IPC methods (Shared memory) (0) | 2020.06.11 |
시스템 프로그래밍 12장 - IPC methods (FIFO) (0) | 2020.06.11 |
시스템 프로그래밍 11장 - Timer (0) | 2020.06.11 |
시스템 프로그래밍 10장 - Signal 2 (0) | 2020.06.11 |