IPC 설비
key
message queue, semaphore, shared memory segment에 대한 identifer
서로 다른 process들도 동일 IPC 객체는 같은 key 값으로 접근한다.
key 값 생성
#include <sys/ipc.h>
key_t ftok(const char *path, int id);
message passing
message queue를 통한 message 전달
- msgget : queue 생성
- msgsnd : message 보내기
- msgrcv : message 받기
msgget 시스템 호출
사용법
#include <sys/msg.h>
int msgget(key_t key, int permflags);
- key : message queue의 key 값
- permflags = queue에 대한 access permission
- return 값 : 음수가 아닌 queue identifier
msgsnd 시스템 호출
사용법
#Include <sys/msg.h>
int msgsnd(int mqid, const void *message, size_t size, int flags);
- mqid : message queue identifier
- message의 주소 : 보낼 message가 저장된 주소
- size : message의 크기
- flags = IPC_NOWAIT
- return 값은 0 or -1
msgrcv 시스템 호출
사용법
#include <sys/msg.h>
int msgrcv(int mqid, void *message, size_t size, long msg_type, int flags);
- mqid : message queue identifier
- message 주소 : 받은 message를 저장할 저장 장소의 주소
- size : 준비 된 저장 장소의 크기
- msg_type =
- 0 : queue의 첫 message
- > 0 : 해당 값을 갖는 첫 message
- < 0 : mtype값이 절대값보다 작거나 같은 것 중 최소값을 갖는 첫 message
msgctl 시스템 호출
사용법
#include <sys/msg.h>
int msgctl(int mqid, int command, struct msqid_qs *msq_stat);
- mqid : message queue identifier
- command
- IPC_STAT : msg queue의 상태 정보 확인
- IPC_RMID : msg_queue 삭제
semaphore
if (sem > 0)
decrement sem by one;
else {
wait until sem becomes non-zero;
then decrement;
}
increment sem by one;
if (queue of waiting processes not empty)
restart first process in wait queue;
semget 시스템 호출
사용법
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ipc.h>
int semget(key_t key, int nsems, int permflags);
- key : semaphore 집합 이름
- nsems : semaphore 집합 내의 semaphore 수
- permflags : 0600, IPC_CREAT, IPC_EXCL
- return 값 : semaphore 집합 identifier
semctl 시스템 호출
사용법
#include <sys/sem.h>
int semctl(int semid, int sem_num, int command, union semun arg);
- semid : semaphore identifier
- sem_num : 집합 내 특정 semaphore 지정
- command
- IPC_STAT : 상태 정보를 arg.stat에 저장
- IPC_RMID : semaphore 집합 삭제
semop 시스템 호출
사용법
#include <sys/sem.h>
int semop(int semid, struct sembuf *op_array, size_t num_ops);
- semid : semaphore identifier
- oparray : 수행할 연산 지정
- num_ops : op_array내의 sembuf의 수