SYSTEM CALL: shmget(); PROTOTYPE: int shmget ( key_t key, int size, int shmflg ); RETURNS: shared memory segment identifier on success -1 on error: errno = EINVAL (Invalid segment size specified) EEXIST (Segment exists, cannot create) EIDRM (Segment is marked for deletion, or was removed) ENOENT (Segment does not exist) EACCES (Permission denied) ENOMEM (Not enough memory to create segment) NOTES:
shmget()의 첫번째 아규먼트는 키값이다(ftok()호출에 의해 반환된). 이 키값은 커널안에 존재하는 다른 공유 메모리 세그먼트의 키값과 비교되어진다. 이때, 열기 나 접근 동작은 shmflg 아규먼트의 내용에 달려있다.
IPC_CREAT가 혼자 사용되면, shmget()은 새롭게 만들어진 세그먼트의 세그먼트 확인자를 반환하거나 같은 키값을 가진 세그먼트가 존재하면 그 세그먼트의 확인자를 반환한다. IPC_EXCL이 IPC_CREAT와 함께 사용된다면, 새로운 세그먼트가 만들어 지거나 세그먼트가 존재하면, -1값을 가지며 호출은 실패한다. IPC_EXCL은 그 자체로는 쓸모가 없지만, IPC_CREAT와 조합될 때, 존재하지 않는 세그먼트가 접근을 위해 열리는 것을 막는데 사용된다.
다시 한번, 부가적인 8진 모드는 마스크안에 OR될 수 있다.
공유 메모리 세그먼트를 만들고 위치시키기 위한 wrapper 함수를 만들어 보자:
int open_segment( key_t keyval, int segsize ) { int shmid; if((shmid = shmget( keyval, segsize, IPC_CREAT | 0660 )) == -1) { return(-1); } return(shmid); }
프로세스가 주어진 세그먼트의 유효한 IPC 확인자를 가진 후, 다음 단계는 프로세스가 자신의 주소 공간에 세그먼트를 그리거나(map) 붙이는(attach) 것이다.
Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved
Email To:Webmaster ,
Another address
LAST UPDATE Nov 28,1997
Created Nov 28,1997