引用自http://blog.csdn.net/guoping16/article/details/6584043
所需头文件
#include<sys/types>
#include<sys/ipc.h>
#include<sys/sem.h>
int semget(key_t key,int nsems, int semflg)
执行成功则得到一个信号量集标识符或创建一个信号量集对象,出错返回-1,原因存在error中。
key:0(IPC_PRIVATE):会建立新信号集对象
大于0的32位整数:视semflg来确定操作,通常要求此值来源于ftok返回的IPC键值
nsems:创建信号量集中信号量的个数,该参数只在创建信号量时有效
msgflg:0:取信号量集标识符,若不存在则函数会报错
IPC_CREAT:当semgflg&IPC_CREAT为真时,如果内核存在键值与key相等的信号量集,返回此信号量集的标识符,如果不存在,则新建一个信号量集;
IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的信号量集,则新建一个消息队列;如果存在则报错。
int semop(int semid,structsembuf*sops,unsigned nsops)
成功返回信号量的个数,失败返回-1,错误原因存于error中。
semid:信号量集标识符
sops:指向进行操作的信号量集结构体数组首地址
struct sembuf{
short semnum; //信号量编号
short val; //若val>0进行V操作,信号量+val,表示进程资源;
//若val<0进行P操作,信号量-val,若信号量(semval)-val<0,则调用进程阻塞,直到资源可用;
若设置IPC_NOWAIT不会睡眠,进程直接返回EAGIN错误
//若val==0是阻塞等待信号信号量为0,调用进程进入睡眠状态,直到信号值为0;
若设置IPC_NOWAIT,进程不会睡眠,直接返回EAGAIN错误
short flag; //0,设置信号量的默认操作
//IPC_NOWAIT设置信号量操作不等待
//SEM_UNDO选项会让内核记录一个UNDO记录(与调用进程相关),
如果该进程崩溃,则根据这个进程的UNDO记录自动恢复相应信号量的计数值
};
nsops:进行操作信号量的个数,即sops结构变量的个数,需大于或等于1。
下面是信号量操作举例。
structsembuf sem_get={0,-1,IPC_NOWAIT}; /*将信号量对象中序号为0的信号量减1*/
structsembuf sem_get={0,1,IPC_NOWAIT}; /*将信号量对象中序号为0的信号量加1*/
structsembufsem_get={0,0,0}; /*进程被阻塞,直到对应的信号量值为0*/
flag一般为0,若flag包含IPC_NOWAIT,则该操作为非阻塞操作。若flag包含SEM_UNDO,则当进程退出的时候会还原该进程的信号量操作,这个标志在某些情况下是很有用的,比如某进程做了P操作得到资源,但还没来得及做V操作时就异常退出了,此时,其他进程就只能都阻塞在P操作上,于是造成了死锁。若采取SEM_UNDO标志,就可以避免因为进程异常退出而造成的死锁。
http://blog.csdn.net/u013485792/article/details/50764224
关于ftok()函数
key_t ftok(const char *pathname, //指定的文件名,这个文件必须存在且可以访问
int proj_id); //子序号它是一个8bit整数。即范围是0-255.
int semctl(int semid,int semnun,int cmd ,union semun arg)
http://blog.csdn.net/guoping16/article/details/6584043
当函数执行成功,则会返回key_t键值,否则返回-1。