Linux信号量 共享内存和消息队列
1. 信号量
使用信号量可以实现进程间同步。主要函数定义:
#include <sys/sem.h>
int semctl(int sem_id, int sem_num, int command, …);
int semget(key_t key, int num_sems, int sem_flags);
int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops);
semget函数根据提供的key生成信号量标识符;
semctl函数初始化或者删除信号量标识符;
semop函数改变信号量大小
2. 共享内存
共享内存机制使得两个不相关进程可以读取和修改同一段内存从而实现数据共享。主要函数定义:
#include <sys/shm.h>
void *shmat(int shm_id, const void *shm_addr, int shmflg);
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
int shmdt(const void *shm_addr);
int shmget(key_t key, size_t size, int shmflag);
shmget函数根据key生成有效的共享内存段名,根据参数size产生共享的内存容量。
shmat函数将创建的共享内存段连接到一个进程的内存空间中,这样才可以使用该段内存。
shmdt函数将共享内存从当前内存中分离。
shmctl函数可以删除共享内存段。
3. 消息队列
消息队列和命名管道非常类似,但少了打开和关闭管道的复杂性。主要函数如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
int msgget(key_t key, int msgflg);
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);