原创:http://blog.sina.com.cn/u/2312748742
一、信号量时一种变量,只能取正整数值,对于这个信号量只能进行如下两种操作:
1)P-代表等待,它是刚要进入关键代码时的操作,如果Sem_info大于0就对Sem_info进行减1处理,
如果Sem_info=0则进行挂起等待。
2)V-代表信号。它是刚要离开关键代码时的操作,如果有其他进程在等待着而被挂起了,就让他
恢复执行,如果没有进程因等待而被挂起就对Sem_info进行加1处理,
最简单的信号量可以只取0和1,也就是常说的二进制信号量,也可称互斥信号量。
也可以取多种正整数值得信号量,也可称:通用信号量。
二、创建信号量或者取得一个现有的信号量
int semget(key_t key,int num_sems,in sem_flag);
三、改变信号量的键值
int semop(int sem_id,struct sembuf *sem_ops, size_t num_sem_ops)
四、控制信号量的信息
注:ipcrm 可以删除信号量等,man ipcrm查看
例子:
进行v操作,生产馒头:
#include<sys/msg.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include <unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<signal.h>
#include<string.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#define ERR_INFO(info)\
do\
{
}while(0);
int main()
{
}
进行p操作,消费馒头:
#include<sys/msg.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include <unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<signal.h>
#include<string.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#define ERR_INFO(info)\
do\
{
}while(0);
int main()
{
}