반응형
    
    
    
  
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 | 
 
							 
							