目錄api
System V共享內存在概念上相似於Posix共享內存,代之以調用shm_Open後調用mmap的是,先調用shmget,再調用shmat。
對於每一個System V共享內存,內核都維護以下的信息結構,它定義在sys/shm.h頭文件中,其中帶註釋的是咱們須要關注的成員。測試
struct shmid_ds { struct ipc_perm shm_perm; size_t shm_segsz; //共享內存區大小 pid_t shm_lpid; pid_t shm_cpid; shmatt_t shm_nattch; shmat_t shm_cnattch; time_t shm_atime; time_t shm_dtime; time_t shm_ctime; };
shmget用於建立一個新的共享內存或打開一個已存在的共享內存。ui
//成功返回共享內存標識符, int shmget(key_t key, size_t size, int oflag);
shmat用於把shmget建立或打開的共享內存鏈接到調用進程的地址空間。3d
//成功返回映射區起始地址,失敗返回-1 void *shmat(int shmid, const void *shmaddr, int flag);
shmdt刪除由shmat創建的鏈接。code
//成功返回0,失敗返回-1 int shmdt(const void *shmaddr);
shmctl用於對共享內存的各類控制操做。blog
//成功返回0,失敗返回-1 int shmctl(int shmid, int cmd, struct shmid_ds *buf);
cmd可以使用的命令有三個:進程
#ifndef _COMMON_H_ #define _COMMON_H_ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #define FTOK_FILE "/home/delphi/ftok.file" #define FTOK_ID 1 #define SHM_RD_PERMISSION 0444 #define SHM_WR_PERMISSION 0222 #define SHM_RW_PERMISSION (SHM_RD_PERMISSION | SHM_WR_PERMISSION) #endif
#include "common.h" int main(int argc, char **argv) { int length = atoi(argv[1]); int oflag = IPC_CREAT | SHM_RW_PERMISSION; int shmid = shmget(ftok(FTOK_FILE, FTOK_ID), length, oflag); if (shmid >= 0) { printf("shmget create success, shmid = %d\n", shmid); } return 0; }
#include "common.h" int main(int argc, char **argv) { int shmid = shmget(ftok(FTOK_FILE, FTOK_ID), 0, SHM_RW_PERMISSION); shmctl(shmid, IPC_RMID, NULL); return 0; }
#include "common.h" int main(int argc, char **argv) { int shmid; unsigned char *shmadd; struct shmid_ds buf; int i; shmid = shmget(ftok(FTOK_FILE, FTOK_ID), 0, SHM_RW_PERMISSION); shmadd = shmat(shmid, NULL, 0); shmctl(shmid, IPC_STAT, &buf); for (i = 0; i < buf.shm_segsz; i++) { *shmadd++ = i % 256; } return 0; }
#include "common.h" int main(int argc, char **argv) { int shmid; unsigned char *shmadd; unsigned char v; struct shmid_ds buf; int error = 0; int i; shmid = shmget(ftok(FTOK_FILE, FTOK_ID), 0, SHM_RW_PERMISSION); shmadd = shmat(shmid, NULL, 0); shmctl(shmid, IPC_STAT, &buf); for (i = 0; i < buf.shm_segsz; i++) { v = *shmadd++; if (v != (i % 256)) { printf("error: shmadd[%d] = %d\n", i, v); error++; } } if (error == 0) { printf("all of read is ok\n"); } return 0; }