시스템의 프로세스 간 통신(1)

hgh1472·2023년 12월 23일
0

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
    • IPC_CREAT
    • IPC_EXCL
  • 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

  • wait 연산
if (sem > 0)
	decrement sem by one;
else {
	wait until sem becomes non-zero;
    then decrement;
}
  • signal 연산
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의 수

0개의 댓글