SHMCTL(2)

명칭
shmctl - 공유 메모리 제어

프로그램 라이브러리
libc

서식
<machine/param.h> <sys/types.h> <sys/ipc.h> <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf)

해설
shmid 에 의해 지정된 공유 메모리세그먼트상에서 cmd 에 의해 지정된 처리를 실행합니다.

IPC_STAT
    struct shmid_ds 의 세그먼트(segment)를 취득해, buf 에 의해 지정된 메모리에 그것을 보존합니다.

IPC_SET
    struct shmid_ds 세그먼트(segment)의 shm_perm.uid, shm_perm.gid, 및 shm_perm.mode 의 각 멤버를 buf 그리고 가리켜진 구조체의 멤버로 변경합니다. 호출 프로세스의 실효 유저 ID 는, shm_perm.uid 또는 shm_perm.cuid 의 어느 쪽일까하고 일치하는지, 또는 슈퍼 유저 특권을 가지고 있다 필요가 있습니다.

IPC_RMID
    시스템으로부터 세그먼트(segment)를 제거합니다. 세그먼트(segment)에 아탓치 한 모든 프로세스가 종료할 때까지, 제거는 행해지지 않습니다. 그러나, 일단 IPC_RMID 조작이 실행되면(자), 그 이후 프로세스는 그 세그먼트(segment)에 아탓치 하는 것이 용서되지 않습니다. 조작이 성공하기 위해서(때문에)는, 호출 프로세스의 실효 유저 ID 가 shm_perm.uid 또는 shm_perm.cuid (와)과 일치하는지, 또는 호출해 프로세스에 슈퍼 유저 특권이 필요합니다.

shmid_ds 구조체는 다음과 같이 정의됩니다.

    struct shmid_ds {
        struct ipc_perm shm_perm;   /* 조작 퍼미션 구조체 */
        int             shm_segsz;  /* 세그먼트(segment)의 사이즈 (바이트 단위) */
        pid_t           shm_lpid;   /* 마지막 공유 메모리 조작의 프로세스 ID */
        pid_t           shm_cpid;   /* 작성자의 프로세스 ID  */
        short           shm_nattch; /* 현재의 아탓치의 수 */
        time_t          shm_atime;  /* 마지막 shmat()의 시각 */
        time_t          shm_dtime;  /* 마지막 shmdt()의 시각 */
        time_t          shm_ctime;  /* shmctl()에 의한 마지막 변경의 시각 */
        void           *shm_internal; /* SystemV 의 어리석은 짓 */
    };

반환값

에러
shmctl() (은)는 다음의 경우에 처리에 실패합니다.

[EINVAL]
    무효인 조작, 또는 shmid (으)로 지정된 공유 메모리세그먼트가 검출되지 않았습니다.

[EPERM]
    호출 프로세스의 실효 유저 ID 가, 공유 메모리세그먼트의 소유자 또는 작성자의 유저 ID 와 일치하지 않습니다.

[EACCES]
    조작과 공유 메모리세그먼트모드의 사이의 불일치를 위해서(때문에) 퍼미션이 거절되었습니다.

관련 항목
shmat(2), shmdt(2), shmget(2), ftok(3)