linux sem_wait semop 区别
时间: 2024-01-14 19:04:51 浏览: 159
`sem_wait()` 和 `semop()` 都是用于操作 Linux 系统中的信号量的函数,但是它们之间有一些区别。
`sem_wait()` 函数是 POSIX 标准中定义的函数,其原型为:
```
#include <semaphore.h>
int sem_wait(sem_t *sem);
```
该函数的作用是将信号量 sem 的值减 1,如果信号量的值小于等于 0,则当前线程会被阻塞,直到有其他线程调用 `sem_post()` 函数将信号量的值加 1。
`semop()` 函数是 System V IPC(Inter-Process Communication,进程间通信)的一部分,其原型为:
```
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, size_t nsops);
```
该函数是一个通用的信号量操作函数,可以用于实现 `sem_wait()`、`sem_post()` 等功能。`semop()` 函数的第一个参数 semid 是信号量集合的标识符,第二个参数 sops 是一个指向信号量操作结构体数组的指针,nsops 指定了 sops 数组中元素的数量。信号量操作结构体 sembuf 定义如下:
```
struct sembuf {
unsigned short sem_num; // 信号量集合中信号量的编号,从 0 开始
short sem_op; // 信号量操作,可以是正数、负数或 0
short sem_flg; // 操作标志,通常设为 SEM_UNDO
};
```
其中,sem_op 的含义和 `sem_wait()` 函数相同,如果 sem_op 是负数,那么当前进程会被阻塞,直到信号量的值大于等于 |sem_op|。
因此,`sem_wait()` 函数可以看作是 `semop()` 函数的特例,当 sem_op 为 -1 时,`semop()` 函数就等同于 `sem_wait()` 函数。而 `semop()` 函数的优势在于可以同时修改多个信号量的值,从而实现更复杂的同步和互斥操作。
阅读全文