1장. shmget(2)
공유메모리 영역을 할당한다.
1.2. 설명
shmget()은 주어진 인자 key를 접근번호로 하는 공유메모리 공간할당을 커널에 요청한다. 커널에서 성공적으로 공유메모리 공간을 할당하게 되면 공유메모리를 가르키는 식별자를 리턴하게 된다. 생성될 공유메모리 공간의 크기는 size를 통해서 byte 단위 크기로 지정할 수 있다. 공간의 할당은 shmflg가 IPC_PRIVATE이거나 key 를 가지는 공유메모리영역이 존재하지 않거나, IPC_CREAT가 지정되었을 경우 (shmflg&IPC_CREAT가 0이 아닌)에 이루어진다.
다음은 사용가능한 shmflg값들이다.
- IPC_CREAT
-
새로운 영역을 할당한다. 만약 이 값이 사용되지 않았다면, shmget()은 key로 이미 생성된 접근 가능한 공유메모리 영역이 있는지 확인하고 이에 대한 식별자를 되돌려줄 것이다.
- IPC_EXCL
-
IPC_CREAT와 함께 사용하며 공유메모리 영역이 이미 존재하면 에러를 리턴한다.
- mode_flags(하위 9bit)
-
접근 권한의 지정을 위해서 사용한다. 실행권한은 사용하지 않는다.
만약 새로운 영역이 생성되었다면 shmflg의 권한정보는 영역에 대한 정보가 정의되어 있는 shmid_ds 구조체의 멤버인 shm_perm으로 복사된다. shmid_ds 구조체는 아래와 같이 정의되어 있다.
struct shmid_ds { |
1.5. 에러
- EINVAL
-
공유 영역생성시 너무 작은 공간을 할당 하거나(size < SHMMIN) 너무 큰 공간(size > SHMMAX)을 할당했을 경우
- EEXIST
-
- EACCESS
-
IPC_CREAT | IPC_EXCL 로 생성을 요청했는데, 이미 공유 메모리 영역이 존재하고 있을 경우,
- ENOSPC
-
size만큼의 공간을 할당할 수 없을 경우. 사용가능한 공간은 SHMALL값으로 커널전역적으로 정의되어 있다. (/usr/include/linux/shm.h 참고)
- ENOENT
-
IPC_CREAT를 사용하지 않았는데, 해당 key를 가지는 공유 메모리 영역이 존재 하지 않는 경우
- EACCESS
-
공유 메모리 영역에 대한 접근권한이 주어져 있지 않다.
- ENOMEM
-
이용할 수 있는 커널 메모리가 충분하지 않다.
1.7. 참고문헌
'About 배우고 익히는법 > 펌글' 카테고리의 다른 글
[Linux] NCURSES 프로그래밍 (0) | 2013.12.31 |
---|---|
[Linux] shmat - 공유메모리 관리 연산 (0) | 2013.12.31 |
[Linux] Charater Cell Graphics (0) | 2013.12.31 |
[Linux] NCURSES Programming HOWTO (0) | 2013.12.31 |
[Linux] signal 기초 -1 (0) | 2013.12.31 |