进程间通讯 (3)-信号量相关函数

信号量相关函数分析:
1.semget()信号创建函数,获取与某个键关联的信号量集标识

原型:int semget(key_t key,int nsems,int semflg);

   key:所创建或打开信号量集的键值。
   nsems:创建的信号量集中的信号量的个数,该参数只在创建信号量集时有效。
   semflg:调用函数的操作类型,也可用于设置信号量集的访问权限,两者通过or表示

返回值说明:

     如果成功,则返回信号量集的IPC标识符。

     如果失败,则返回-1,errno被设定成以下的某个值
     EACCES:没有访问该信号量集的权限
     EEXIST:信号量集已经存在,无法创建
     EINVAL:参数nsems的值小于0或者大于该信号量集的限    制;或者是该key关联的信号量集已存在,并且nsems大于该信号量集的信号量数
     ENOENT:信号量集不存在,同时没有使用IPC_CREAT
     ENOMEM :没有足够的内存创建新的信号量集
     ENOSPC:超出系统限制
  1. semctl ();//控制信号量的信息。

原型:int semctl(int _semid ,int _semnum,int _cmd ……)

 semid   信号量的标志码(ID),也就是semget()函数的返回值;
 semnum,  操作信号在信号集中的编号。从0开始。
 cmd    命令,表示要进行的操作。

下面列出的这些命令来源于百度,cmd中可以使用的命令如下:

 IPC_STAT读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。
 IPC_SET设置信号量集的数据结构semid_ds中的元素      ipc_perm,其值取自semun中的buf参数。
 IPC_RMID将信号量集从内存中删除。
 GETALL用于读取信号量集中的所有信号量的值。
 GETNCNT返回正在等待资源的进程数目。
 GETPID返回最后一个执行semop操作的进程的PID。
 GETVAL返回信号量集中的一个单个的信号量的值。
 GETZCNT返回这在等待完全空闲的资源的进程数目。
 SETALL设置信号量集中的所有的信号量的值。
 SETVAL设置信号量集中的一个单独的信号量的值。

返回值:成功返回0,失败返回-1;

3.semop ()//用户改变信号量的值。就是使用资源还是释放资源使用权。

原型:int semop(int semid ,struct sembuf *_sops ,size_t _nsops);

返回值:成功返回0,失败返回-1;
    _semid : 信号量的标识码。也就是semget()的返回值。
    _sops是一个指向结构体数组的指针。
 struct   sembuf{
     unsigned short  sem_num;//第几个信号量,第一个信号量为0;
     short  sem_op;//对该信号量的操作。
     short _semflg;
};

sem_num:  操作信号在信号集中的编号。第一个信号的编号为0;
sem_op : 如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。
_semflg IPC_NOWAIT :对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。
IPC_UNDO :程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。 
nsops:操作结构的数量,恒大于或等于1

“`

猜你喜欢

转载自blog.csdn.net/s_yj_q/article/details/78174882