SHMCTL(2)

이름
shmctl - 공유 메모리를 제어한다.

사용법
#include <sys/ipc.h>

#include <sys/shm.h>

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

설명
shmctl() 는 사용자가 공유 메모리 세그먼트에 관한 정보를 얻거나 공유 메모리 세그먼트의 소유자, 그룹, 허가권들을 설정하거나 세그먼트를 파괴하는걸 허용한다. shmid로 식별되는 세그먼트에 관한 정보는 shmid_ds 구조체로 리턴된다:

struct shmid_ds {
	struct	ipc_perm shm_perm;	/* 퍼미션 */
	int	shm_segsz;		/* 세그먼트의 크기(bytes) */
	time_t	shm_atime;		/* 마지막 접근 시간 */
	time_t	shm_dtime;		/* 마지막 제거 시간 */
	time_t	shm_ctime;		/* 마지막 변경 시간 */
	unsigned short	shm_cpid;	/* 생성자의 pid */
	unsigned short	shm_lpid;	/* 마지막으로 작동한 프로세스의 pid */
	short	shm_nattch;		/* 현재 접근한 프로세스의 수 */
	/* 다음은 개별적이다 */
	unsigned short   shm_npages;  /* 세그먼트의 크기(pages) */
	unsigned long   *shm_pages;
	struct shm_desc *attaches;    /* 접근을 위한 기술자들 */
};

shm_perm 멤버의 필드들은 설정될수 있다:

struct ipc_perm
{
  key_t  key;
  ushort uid;   /* owner의 euid 와 egid */
  ushort gid;
  ushort cuid;  /* 생성자의 euid 와 egid */
  ushort cgid;
  ushort mode;  /* 접근 모드의 하위 9 bits */
  ushort seq;   /* 연속 수(sequence number) */
};

다음 cmds가 이용될수 있다:

IPC_STAT
    공유 메모리 세그먼트에 관한 정보를 버퍼 buf에 복사하기 위해 사용된다. 사용자는 공유 메모리 세그먼트에 read접근을 해야 한다.

IPC_SET
    shm_perms필드의 uid, gid, or mode 멤버들에 대한 사용자 변경을 적용하기 위해 사용된다. mode의 하위 9비트들만이 사용된다. shm_ctime 멤버 또한 갱신된다. 사용자는 소유자, 생성자, 또는 슈퍼 유저이어야 한다.

IPC_RMID
    파괴될 세그먼트를 표시하기 위해 사용된다. 실제로는 마지막 분리후에 파괴된다. (즉, 관련된 shmid_ds 구조체의 shm_nattch 멤버가 0일때) 사용자는 소유자, 생성자 또는 슈퍼 유저이어야 한다.

사용자는 세그먼트가 결국 파괴 되었다는것을 보장해야 한다: 그렇지 않으면 폴트가 난 페이지들은 메모리나 스왑에 남아 있을 것이다.

게다가, super-user는 다음 cmds와 관련된 공유 메모리 세그먼트의 스왑핑을 금지하거나 허용할수 있다: (Linux only)

SHM_LOCK
    공유 메모리 세그먼트의 스와핑을 막는다. 사용자가 있어야 하는 페이지들을 잠금후에 요구한다면 위반이다.

SHM_UNLOCK
    공유 메모리 세그먼트에 대한 스와핑을 허용한다.

IPC_INFO, SHM_STAT 그리고 SHM_INFO 는 할당된 자원들에 관한 정보를 제공하는 ipcs(8) 의 의해 사용된다. 미래에, 이것들은 proc 파일 시스템 인터페이스를 위해서 필요할때 수정되거나 이동될수 있다.

SYSTEM CALLS

fork()
    fork() 후에 자식 프로세스는 연결된 공유 메모리 세그먼트들을 상속한다.

exec()
    exec() 후에 연결된 모든 공유 메모리 세그먼트들은 분리된다.(파괴되는것이 아니다.)

exit()
    exit() 시에 연결된 모든 공유 메모리 세그먼트들은 분리된다.(파괴되는것이 아니다.)

반환값
성공시 0이 리턴되며, 에러시 -1이 리턴된다.

에러
에러시, errno 는 다음중 하나로 설정된다.

EACCES
    IPC_STAT가 요청되고 shm_perm.modes가 msqid 에 대한 읽기 접근이 허용되지 않을 경우 리턴된다.

EFAULT
    cmd 인자가 IPC_SET 나 IPC_STAT 값을 가지고 있지만 buf 에 지정된 주소는 접근할수 없다.

EINVAL
    shmid가 유효 식별자가 아니거나 cmd가 유효한 명령어가 아니라면 리턴된다.

EIDRM
    shmid가 제거된 식별자를 가리키고 있다면 리턴된다.

EPERM
    IPC_SET나 IPC_RMID가 시도됐고 사용자가 생성자나 소유자 또는 슈퍼유저가 아니고, 사용자가 그룹이나 그외에 대한 허가권을 가지고 있지 않다면 리턴된다.

호환
SVr4, SVID. SVr4는 추가적으로 EINVAL, ENOENT, ENOSPC, ENOMEM, EEXIST 에러 조건들을 문서화했다. SVr4나 SVID 모두 EIDRM 에러 조건은 문서화 하지 않았다.

관련 항목
shmget(2), shmop(2)

역자
정강훈 <skyeyes@soback.kornet.net>, 2000년 5월 18일