이 름
shmop − 공 유 메 모 리 작 동 들
사 용 법
# include
<sys/types.h>
# include <sys/shm.h>
void *shmat ( int shmid, const void *shmaddr, int shmflg )
int shmdt ( const void *shmaddr)
설 명
shmat 함 수 는 shmid 로 식 별 되 는 공 유 메 모 리 세 그 먼 트 를 호 출 프 로 세 스 의 데 이 터 세 그 먼 트 에 연 결 한 다 . 연 결 될 주 소 는 다 음 조 건 중 하 나 의 shmaddr 로 지 정 된 다 .
If shmaddr 가 0 이 면 , 시 스 템 은 1 − 1.5G사 이 의 영 역 에 서 상 위 에 서 부 터 하 위 로 대 응 되 지 않 은 영 역 을 찾 는 다 .
shmaddr 가 0 이 아 니 고 SHM_RND 가 shmflg 에 지 정 되 어 있 으 면 , shmaddr 가 SHMLBA 의 배 수 의 주 소 로 연 결 이 발 생 한 다 . 그 렇 지 않 으 면 shmaddr 는 연 결 할 수 있 는 정 렬 된 페 이 지 주 소 이 어 야 한 다 .
만 일 SHM_RDONLY 가 shmflg 에 지 정 되 면 , 이 세 그 먼 트 는 읽 기 전 용 으 로 연 결 되 며 프 로 세 스 는 세 그 먼 트 에 읽 기 접 근 허 가 권 을 가 져 야 만 한 다 . 그 렇 지 않 으 면 세 그 먼 트 는 읽 기 -쓰 기 로 연 결 되 며 프 로 세 스 는 세 그 먼 트 에 읽 기 -쓰 기 접 근 허 가 권 들 을 가 져 야 만 한 다 . 쓰 기 전 용 공 유 메 모 리 세 그 먼 트 에 대 한 표 시 는 없 다 .
호 출 프 로 세 스 의 brk 값 은 연 결 시 바 뀌 어 지 지 않 는 다 . 세 그 먼 트 는 프 로 세 스 가 종 료 할 때 자 동 적 으 로 분 리 된 다 . 같 은 세 그 먼 트 는 그 프 로 세 스 주 소 공 간 에 서 읽 기 전 용 으 로 , 읽 기 -쓰 기 로 , 한 번 이 상 연 결 될 수 있 다 .
성 공 시 shmat 시 스 템 콜 은 공 유 메 모 리 세 그 먼 트 에 서 다 음 과 같 은 shmid_ds 구 조 체 멤 버 들 을 갱 신 한 다 .
shm_atime 는 현 재 시 간 으 로 설 정 된 다 .
shm_lpid 는 호 출 프 로 세 스 의 프 로 세 스 -ID로 설 정 된 다 .
shm_nattch 는 1 증 가 한 다 .
공 유 메 모 리 세 그 먼 트 가 삭 제 로 서 표 시 될 경 우 도 역 시 분 리 된 다 .
함 수 shmdt 는 호 출 프 로 세 스 의 데 이 타 세 그 먼 트 에 서 shmaddr 로 지 정 된 주 소 에 위 치 한 공 유 메 모 리 세 그 먼 트 를 분 리 한 다 . 공 유 메 모 리 세 그 먼 트 의 분 리 는 shmat 시 그 템 콜 로 연 결 된 값 과 같 은 shmaddr 를 가 지 고 있 는 현 재 연 결 된 세 그 먼 트 들 중 하 나 (프 로 세 스 의 주 소 공 간 )이 어 야 한 다 .
성 공 시 , shmdt 시 스 템 콜 은 공 유 메 모 리 세 그 먼 트 에 서 다 음 과 같 은 shmid_ds 구 조 체 멤 버 들 을 갱 신 한 다 .
shm_dtime 는 현 재 시 간 으 로 설 정 된 다 .
shm_lpid 는 호 출 프 로 세 스 의 프 로 세 스 -ID로 설 정 된 다 .
shm_nattch 는 1 감 소 한 다 . 만 일 0이 고 세 그 먼 트 가 삭 제 표 시 되 어 있 드 면 세 그 먼 트 는 삭 제 된 다 .
호 출 프 로 세 스 의 유 저 공 간 에 점 유 된 영 역 은 대 응 이 풀 리 지 않 는 다 .
SYSTEM CALLS
fork() |
fork() 후 에 자 식 프 로 세 스 는 연 결 된 공 유 메 모 리 세 그 먼 트 들 을 상 속 한 다 . | ||
exec() |
exec() 후 에 모 든 연 결 된 공 유 메 모 리 세 그 먼 트 들 은 분 리 된 다 .(파 괴 되 는 것 이 아 니 다 .) | ||
exit() |
exit() 시 모 든 연 결 된 공 유 메 모 리 세 그 먼 트 는 분 리 된 다 .(파 괴 되 는 것 이 아 니 다 .) |
반 환 값
실 패 시 두 함 수 는 모 두 에 러 를 가 리 키 는 errno 와 −1 를 리 턴 하 며 그 렇 지 않 으 면 shmat 는 연 결 된 공 유 메 모 리 세 그 먼 트 의 주 소 를 리 턴 한 다 . 그 리 고 shmdt 는 0 를 리 턴 한 다 .
에 러
shmat 가 실 패 할 때 , 리 턴 되 는 errno 는 다 음 값 중 하 나 로 설 정 된 다 .
EACCES |
호 출 프 로 세 스 는 요 구 된 연 결 타 입 에 대 한 접 근 허 가 권 들 이 없 다 . | ||
EINVAL |
유 효 하 지 않 은 shmid 값 , 정 렬 되 지 않 은 (즉 , 페 이 지 정 렬 이 아 니 고 SHM_RND가 지 정 되 지 않 았 다 .) 또 는 유 효 하 지 않 은 shmaddr 값 , 또 는 brk 에 연 결 실 패 | ||
ENOMEM |
기 술 자 나 페 이 지 테 이 블 들 을 위 해 메 모 리 를 할 당 할 수 없 다 . |
shmaddr 에 연 결 된 공 유 메 모 리 세 그 먼 트 가 없 다 면 함 수 shmdt 는 실 패 할 수 있 다 . 이 경 우 리 턴 되 는 errno 는 EINVAL 으 로 설 정 될 것 이 다 .
주 의
fork(2) 시 스 템 콜 실 행 시 자 식 프 로 세 스 는 연 결 된 모 든 공 유 메 모 리 세 그 먼 트 둘 을 상 속 한 다 .
execve(2) 로 실 행 되 는 프 로 세 스 에 연 결 된 공 유 메 모 리 세 그 먼 트 들 은 결 과 프 로 세 스 에 연 결 되 지 않 을 것 이 다 .
다 음 은 shmat 시 스 템 콜 에 영 향 을 미 치 는 시 스 템 인 자 이 다 :
SHMLBA |
Segment low boundary address multiple. 페 이 지 들 은 정 렬 되 어 야 한 다 . 현 재 수 행 시 SHMBLA 값 은 PAGE_SIZE 이 다 . |
수 행 시 프 로 세 스 당 공 유 메 모 리 세 그 먼 트 최 대 수 에 어 떠 한 내 부 제 한 도 없 다 . (SHMSEG)
호 환
SVr4, SVID. SVr4는 EMFILE 에 러 조 건 을 문 서 화 했 다 . SVID-v4에 서 shmaddr 인 자 는 char * 에 서 const void * 로 바 뀌 었 으 며 shmat()의 리 턴 타 입 은 char * 에 서 void * 으 로 바 뀌 었 다 . (Linux libc4 와 libc5는 char * 타 입 을 가 지 고 있 다 .; glibc2는 void * 을 가 지 고 있 다 .)
관 련 항 목
역 자
정 강 훈 <skyeyes [AT] soback.net>, 2000년 5월 16일