System V信号量的操作函数主要有3个,其函数原型分别为:semget、semctl、semop ,编写一段程序,使用这三个函数对信号量进行创建、发送命令或者操作。
时间: 2024-05-02 07:16:37 浏览: 304
信号量操作集
以下是一个使用System V信号量操作函数的示例程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int main()
{
int semid;
key_t key;
struct sembuf sb;
// 创建一个key值
if ((key = ftok(".", 'a')) == -1) {
perror("ftok");
exit(1);
}
// 创建一个信号量集合,包含一个信号量
if ((semid = semget(key, 1, 0666 | IPC_CREAT)) == -1) {
perror("semget");
exit(1);
}
// 设置信号量的值为 1
if (semctl(semid, 0, SETVAL, 1) == -1) {
perror("semctl");
exit(1);
}
// 使用信号量等待和释放操作
sb.sem_num = 0;
sb.sem_op = -1; // 等待信号量
sb.sem_flg = SEM_UNDO;
if (semop(semid, &sb, 1) == -1) {
perror("semop");
exit(1);
}
printf("Semaphore acquired!\n");
sb.sem_op = 1; // 释放信号量
if (semop(semid, &sb, 1) == -1) {
perror("semop");
exit(1);
}
printf("Semaphore released!\n");
// 删除信号量
if (semctl(semid, 0, IPC_RMID, 0) == -1) {
perror("semctl");
exit(1);
}
return 0;
}
```
在这个程序中,我们首先使用 `ftok` 函数生成一个 key 值,然后使用 `semget` 函数创建一个包含一个信号量的信号量集合。我们使用 `semctl` 函数将信号量的值设置为 1,然后使用 `semop` 函数等待信号量,释放信号量,并最后使用 `semctl` 函数删除信号量。
阅读全文