-
- 공유 메모리
공유 메모리는 프로세스 간 통신을 위한 메커니즘 중 하나로, 여러 IPC 중 가장 빠른 수행속도를 보여준다.
하나의 메모리 영역을 서로 다른 프로세스가 접근하게 되어, 데이터 복사와 같은 불필요한 오버헤드가 발생하지 않기 때문이다.
단, 동기화 기능을 제공하지 않기 때문에, 세마포어, 뮤텍스 등의 메커니즘을 이용하여 메모리 영역 접근을 동기화 해야한다.
- 공유 메모리 함수
1. key_t ftok(const char *pathname, int proj_id);
2. int shmget(key_t key, size_t size, int shmflag);
공유 메모리를 생성하고 접근할 수 있는 식별자를 반환한다.
3. void *shmat(int shmid, const void *shmaddr, int shmflag);
프로세스가 공유 메모리를 사용할 수 있도록 연결(권한을 부여)한다. shmaddr은 보통 NULL로 둔다.
4. int shmdt(const void *shmaddr);
공유 메모리를 현재 프로세스로 부터 분리(권한을 해제)한다.
5. int shmctl(int shmid, int cmd, struct shmid_ds *buf);
공유 메모리를 제어한다.
ftok로 생성한 고유 키로 shmget으로 공유 메모리를 할당 받은 후 shmaddr로 공유 메모리 주소를 가져온다.
클라이언트에선 입력 값을 shmaddr(공유 메모리) 공간에 복사해주고,
shmctl을 통해 공유 메모리에 대한 정보를 buf 구조체로 가져온다.
그리고 buf에 입력된 정보를 이용해, 이 공유 메모리를 만든 프로세스로 kill을 이용해 SIGUSR1 시그널을 보낸다.
서버에선 대기하다가 SIGUSR1 시그널을 받고 시그널 핸들러에서 myfunc 함수를 호출한다.
받은 값을 1 증가시켜주고, 다시 공유 메모리 공간에 복사하여 넣는다.
이후 shmctl을 통해 공유 메모리에 대한 정보를 buf 구조체로 가져오고,
buf에 입력된 정보를 이용해, 이 공유 메모리를 마지막으로 작동한 프로세스로 kill을 이용해 SIGUSR1 시그널을 보낸다.
다시 클라이언트에선 SIGUSR1 시그널을 받고 시그널 핸들러에서 받은 값을 출력한다.