반응형
shmdt(2)
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
할당된 shared memory segment를 process의 메모리 영역에서 접근할 수 없도록 detach합니다. shmat(2)를 통해서 attach한 메모리를 더 이상 접근할 필요가 없는 경우에는 shmdt(2)를 호출하여 detach합니다. shmat(2)를 통해서 attach한 메모리는 shmdt(2)를 호출하지 않더라도 프로세스가 종료될 때에 자동으로 detach됩니다.
파라미터
shmaddr
- shmat(2)를 통해서 return된 메모리 번지
RETURN
0
- 정상적으로 detach되었습니다.
shmat(2)가 정상적으로 호출되면 shmctl(2)함수에 조회하는 struct shmid_ds의
shm_dtime는 현재 시간으로 설정됩니다.
shm_lpid는 현재 프로세스로 설정됩니다.
shm_nattch는 1 감소합니다.
shmctl(2)을 통해서 이미 삭제된 shmid라도 shm_nattch값이 0이 아니면 0이 될 때까지 삭제되지 않습니다.
shmdt(2)나 프로세스의 종료에 의해서 shm_nattch가 0이 되면 segment가 삭제됩니다.
(시스템에 따라서는 detach를 기다리지 않고 삭제될 수 있음)
-1
- 오류가 발생하였으며, 상세 오류내용은 errno에 설정됩니다.
EINVAL : shmaddr이 shared memory에 의해서 할당된 메모리 영역이 아닙니다.
활용 예제
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
......
int main(int argc, char **argv)
{
int shmid;
int mem_size;
key_t shm_key;
struct my_data_t *shm_data;
......
/* shared memory용 IPC key를 생성함 */
if((shm_key = ftok("~/mywork", 'H')) == -1) {
perror("shared memory key 생성 오류");
return 1;
}
mem_sie = sizeof(struct my_data_t) * 1000;
shmid = shmget((key_t)shm_key, mem_size, 0600 | IPC_CREAT);
if (shmid == -1) {
perror("shmget failed ");
return 1;
}
/* 생성된 shared memroy를 참조함 */
shm_data = shmat(shmid, (void *)0, 0);
if (shm_data == (void *)-1) {
perror("shmat failed ");
return 1;
}
......
/* shared memory를 더 사용하지 않는다면 */
if(shmdt(shm_data) == -1) {
perror("shmdt failed ");
return 1;
}
return 0;
}
반응형
'C언어 header > sys | shm.h' 카테고리의 다른 글
shmat(2) - System V shared memory segment를 pointer로 지정하기 (0) | 2019.09.29 |
---|---|
shmctl(2) - System V shared memory 제어하기 (0) | 2019.09.29 |
shmget(2) - Sysem V shared memory를 할당 (0) | 2019.09.29 |