SHMOP
Section: 리눅스 프로그래머 메뉴얼 (2)
Updated: November 28, 1993
Index
Return to Main Contents
이름
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 *
을 가지고 있다.)
관련 항목
ipc(5),
shmctl(2),
shmget(2)
역자
정강훈 <skyeyes@soback.kornet.net>, 2000년 5월 16일
Index
- 이름
-
- 사용법
-
- 설명
-
- SYSTEM CALLS
-
- 반환값
-
- 에러
-
- 주의
-
- 호환
-
- 관련 항목
-
- 역자
-
This document was created by
man2html,
using the manual pages.
Time: 08:06:59 GMT, March 25, 2004