관련이 없는 다수의 프로세스가 공유하는 메모리 영역. 효율적인 데이터 전달 방법.
한 프로세스가 공유메모리에 데이터 기록하면, 다른 프로세스가 즉시 기록한 내용 읽을 수 있다.
데이터 기록을 확인하기 위한 동기화는 프로그래머가 해결
struct shmid_ds {
struct ipc_perm shm_perm; /* 접근 권한 */
int shm_segsz; /* 세그먼트 크기(바이트) */
time_t shm_atime; /* 마지막 접근 시간 */
time_t shm_dtime; /* 마지막 제거 시간 */
time_t shm_ctime; /* 마지막 변경 시간 */
unsigned short shm_cpid; /* 생성한 프로세스 ID */
unsigned short shm_lpid; /* 마지막으로 동작한 프로세스 ID */
short shm_nattach; /* 부착한 프로세스 수 */
unsigned short shm_npages; /* 공유메모리 크기(페이지 수) */
unsigned long *shm_pages; /* 페이지 테이블 항목을 위한 필드 */
struct shm_desc *attaches; /* 접근을 위한 기술자들 */
}
공유 메모리 생성 후 ID 반환, key에 해당하는 공유 메모리 존재 시 ID 반환, 인자들은 msgget과 동일하게 동작
*shmaddr에 shmid(shared memory)지정, 보통은 주소인자에 0으로 준다. 성공시 메모리 주소, 실패 -1(내가 준 주소가 사용중일때)
int shmflg
- SHM_RDONLY: 공유 메모리를 읽기 전용으로 사용
- SHM_RND: shmaddr이 NULL이 아닐 때, shmaddr을 반올림하여 페이지 크기 경계에 맞춤(주소 정렬)
int shmdt(void *shmaddr)
프로세스 주소 공간에서 공유메모리 분리. 0이면 성공, -1은 실패
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
공유메모리 제어. 성공 0, 실패 -1. cmd는 msg queue와 동일
IPC_SET의 경우엔 shm_perm과 shm_ctime 멤버만 변경가능