반응형

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;
}
반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,