1.共享内存
a. int shmget(key_t key, size_t size, int shmflg); //创建共享内存
参一:为共享内存段命名 参二:size以字节为单位指定需要共享的内存容量 参三:权限标志 IPC_CREAT|0644 返回值:共享内存标识符(非负整数)
b.void *shmat(int shm_id, const void *shm_addr, int shmflg);//第一次创建完共享内存时,启动对该共享内存的访问
参一:共享内存标识符
参二:指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址
参三:shm_flg是一组标志位,通常为0。
返回值:调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.
c.int shmdt(const void *shmaddr);//该函数用于将共享内存从当前进程中分离
参一: b的返回值
d.int shmctl(int shm_id, int command, struct shmid_ds *buf);//用来控制共享内存
参一:共享内存标识符。
参二:
IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。
IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
IPC_RMID:删除共享内存段
第三个参数,buf是一个结构指针,它指向共享内存模式和访问权限的结构。
例
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
shm = shmat(shmid, 0, 0)
if (shmdt(shm) == -1)
if (shmctl(shmid, IPC_RMID, 0) == -1)
2.信号量
a.int semget(key_t key, int num_sems, int sem_flags);//创建新信号量或取已有信号量
参一:参数key是整数值(唯一非零),不相关的进程可以通过它访问一个信号量
参二:信号量数目//几乎为1
参三:标志位 IPC_CREAT
返回值:成功返回一个相应信号标识符(非零),失败返回-1.
b.int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);//改变信号量的值
参一:信号标志符
c.int semctl(int sem_id, int sem_num, int command, …);//直接控制信号量信息
参一:信号标志符
参三:SETVAL:用来把信号量初始化为一个已知的值。p 这个值通过union semun中的val成员设置,其作用是在信号量第一次使用前对它进行设置。
IPC_RMID:用于删除一个已经无需继续使用的信号量标识符。