1 linux的信号量机制
1.1 semget函数
semget函数作用是创建一个新信号量,或去的一个已有信号量的键
int semget(key_t key, int num_sems, int sem_flags);
key:整数值。不相关的进程可以通过它访问同一个信号量。(键<-->信号量标识符)(所有其他信号量函数都是使用由semget函数返回的信号量标识符)
num_sems:指定需要的信号量数目。(一般是1)
sem_flags:标志,例如:设置为IPC_CREATE 和 IPC_EXCL 可以确保创建出的是一个新的、唯一的信号量。
返回:成功时返回一个正数,即 信号量标识符。
1.2 semop函数
semop函数用于改变信号量的值。定义如下:
int semop(int sem_id, struct sembuf* sem_ops, size_t num_sem_ops);
struct sembuf{
short sem_num;//信号量编号
short sem_op;//信号量在一次操作中需要改变的数值(-1 - p 1 - v)
short sem_flg;//通常被设置为SEM_UNDO,操作系统跟踪当前进程对这个信号量的修改情况。OS自动释放该进程持有的信号量。
}
sem_id:由semget函数返回的信号量标识符
1,3 semctl函数
semctl函数是用来直接控制信号量信息,定义如下:
int semctl(int sem_id, int sem_num, int command, ...);
sem_num:信号量编号,当需要用到承租的信号量时,就要用到这个参数,一般取值0,表示这是第一个也是唯一的一个信号量。
command:将要采取的动作。如果有第四个参数,将会是union semun结构,
union semun{
int val;
struct semid_ds *buf;
unsigned short *array
}
command通常取下面两个参数:
SETVAL:用来把信号量初始化为一个已知的值。这个值通过union semun中的val成员设置,其作用是在信号量第一次使用之前对它进行设置。
IPC_RMID:用于删除一个已经无需继续使用的信号量标识符。
1.4 使用信号量
2 共享内存
2.1shmget函数
用shmget()函数来创建共享内存:
int shmget(key_t key, siize_t size, int shmflg);
返回一个共享内存标识符,该标识符用于后续的共享内存函数。
key:为共享内存段命名。(有一个特殊的键值IPC_PRIVATE:用于创建一个只属于创建进程的共享内存,通常不会用到。)
size:以字节为单位指定需要共享内存的容量。
shmflg:9比特的权限标识。由IPC_CREAT定义的一个特殊比特必须和权限标志 按位或才能创建一个新的共享内存段。
2.2shmat函数
第一次创建共享内存段时,它不能被任何进程访问。要想启动对该共享内存的访问,必须将其连接到一个进程的地址空间中。这项工作由shmat函数完成,定义如下:
void* shmat(int shm_id, const void* shm_addr, int shmflg);
shm_id:shemget返回的共享内存标识符。
shm_addr:指定共享内存连接到当前进程的位置。通常是一个空指针,表示让系统来选择共享内存出现的地址。
shmflg:有两个可能的取值SHM_RND SHM_RDONLY
返回:如果调用成功,返回一个纸箱共享内存第一个字节的指针,如果失败:-1
2.3shmdt
shmdt函数作用是将共享内存从当前进程中分离。参数是shmat返回的地址指针。成功:返回0,失败:返回-1。注意,将共享内存分离并未删除它,只是使得该共享内存对当前进程不在可用。
2.4shmctl
共享内存控制函数:
int shmctl(int shm_id, int command, struct shmid_ds *buf);
struct shmid_ds{
uid_t shm_perm.uid;
uid_t shm_perm.g
id;
mode_t shm_perm.mode;
}
第二个参数command是要采取的动作,可以取三个值:
IPC_STAT:把shmid结构中的数据设置为共享内存的当前关联值
IPC_SET:如果进程有足够权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
IPC_RMID:删除共享内存段。
buf:指向包含共享内存模式和访问权限的结构。
3.消息队列
与命名管道相比,消息队列的优势在于:独立于发送和接收进程而存在。消除了在同步命名管道的打开和关闭时产生的一些困难。(不需要又进程自己来提供同步方法。这是消息相对于管道的一个明显优势)