信号量组函数接口
信号量
信号量本质上是一个数字(非负整数),用来表示一种资源的数量,当多个进程或者线程争夺这些稀缺资源的时候,可以使用信号量来保证他们合理地、秩序地使用这些资源。
申请信号量的操作称为P(Passeren)操作,把归还信号量的操作称为V(vrijgeven)操作。
- P操作
P操作指的是请求分配资源,也就是说每完成一次P操作,则信号量资源会减一,当信号量资源为0时,如果有进程或者线程请求分配资源,则会导致阻塞,直到有进程释放信号量。 - V操作
V操作指的是请求释放资源,也就是说每完成一次V操作,则信号量资源会加一
注意:P操作和V操作属于原子操作,也就是进程在进行P操作或者V操作的过程中不会被打断,也就是不管资源申请成功还是申请失败都是一次性完成。
semget函数
此函数可以创建或者打开一个信号量
int semget(key_t key, int nsems, int semflg);
//key:IPC对象的键值key,可以调用ftok()函数由系统生成一个key
//nsems:信号量集中的信号量元素数量
//semflg:创建或者打开信号量集的标志,IPC_CREAT、IPC_EXCL,还可以指定信号量集的权限,权限采用八进制
//ret:成功返回一个信号量集的标识符,失败返回-1
semop函数
该函数可以实现对信号量进行申请或者释放
struct sembuf
{
unsigned short sem_num;
short sem_op;
short sem_flg;
};
//sem_num:信号量集中的信号量元素的下标,通过它可以访问信号量集中的某个信号量
//sem_op:指的是对选中的信号量的操作,常见的操作就是P/V操作
//如果是正整数,则表示释放信号量,相当于完成V操作。
//如果是负整数则表示申请信号量,相当于完成P操作。
//如果为0时,就称为等零操作,即阻塞等待直到对应的信号量元素的值为零。
//sem_flg是对选中的信号量的操作标志,常见的标志有IPC_NOWAIT和SEM_UNDO。
int semop(int semid, struct sembuf *sops, size_t nsops);
//semid:操作的信号量集的标识符ID
//sops:是一个指向struct sembuf的结构体指针
//nsops:指的是要完成P/V操作的结构体数组的元素个数,利用该参数可以指定要操作多少个信号量。
//ret:成功返回0,失败返回-1,并会设置对应的错误码
//notice:进行P操作时,如果信号量的值小于要申请的数量,则会导致进程阻塞
semctl函数
该函数可以实现设置信号量集的属性、获取信号量集的属性、删除信号量集等操作。
int semctl(int semid, int semnum, int cmd, ...);
//semid:信号量的id
//semnum:指定信号量集中的某个信号量编号(从 0 开始)。如果操作是针对整个信号量集的,则可以设置为 0。
//cmd:指定对信号量的操作命令IPC_STAT、IPC_SET、IPC_RMID等
//ret:成功时返回 0(对于 IPC_RMID、IPC_SET 等命令)或返回信号量的值(对于 GETVAL 等命令)。失败时返回 -1,并设置 errno 为相应的错误码
浙公网安备 33010602011771号