sem_open和iset_init的使用示例
时间: 2023-12-12 21:05:21 浏览: 155
1. sem_open 示例
`sem_open()` 函数可以用于创建一个新的命名信号量,或者获取一个已经存在的信号量的引用。
```c
#include <semaphore.h>
#include <fcntl.h> /* For O_CREAT, O_EXCL, O_TRUNC */
#include <sys/stat.h> /* For mode constants */
int sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
```
参数说明:
- `name`: 信号量的名称。
- `oflag`: 标志位,用于指定创建或获取信号量的方式,包括:
- `O_CREAT`: 如果信号量不存在,则创建它。
- `O_EXCL`: 与 `O_CREAT` 一起使用,如果信号量已经存在则返回错误。
- `O_TRUNC`: 如果信号量已经存在,则将其重置为初始值。
- `O_RDWR`: 打开信号量的读写权限。
- `mode`: 创建信号量时所使用的权限掩码。
- `value`: 信号量的初始值。
示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
int main()
{
sem_t *sem;
int value;
// 创建信号量
sem = sem_open("/test_sem", O_CREAT | O_EXCL, 0644, 1);
if (sem == SEM_FAILED) {
perror("sem_open");
exit(EXIT_FAILURE);
}
// 获取信号量的当前值
sem_getvalue(sem, &value);
printf("Sem value: %d\n", value);
// 等待信号量
sem_wait(sem);
printf("Sem locked.\n");
// 释放信号量
sem_post(sem);
printf("Sem unlocked.\n");
// 关闭信号量
sem_close(sem);
// 删除信号量
sem_unlink("/test_sem");
return 0;
}
```
2. iset_init 示例
`iset_init()` 函数可以用于初始化一个互斥锁的属性对象。
```c
#include <pthread.h>
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
```
参数说明:
- `attr`: 互斥锁属性对象的地址。
示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int main()
{
pthread_mutexattr_t attr;
pthread_mutex_t mutex;
// 初始化互斥锁属性对象
pthread_mutexattr_init(&attr);
// 设置互斥锁属性为递归锁
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
// 初始化互斥锁
pthread_mutex_init(&mutex, &attr);
// 使用互斥锁
pthread_mutex_lock(&mutex);
printf("Mutex locked.\n");
pthread_mutex_unlock(&mutex);
printf("Mutex unlocked.\n");
// 销毁互斥锁
pthread_mutex_destroy(&mutex);
// 销毁互斥锁属性对象
pthread_mutexattr_destroy(&attr);
return 0;
}
```
阅读全文