semctl
是一個用于操作 System V 信號量的 Linux 系統調用
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
key_t key = // 一個唯一的鍵值,可以使用 ftok() 函數生成;
int semid = semget(key, nsems, flags);
其中 nsems
是信號量集中信號量的數量,flags
是創建或獲取信號量集時的權限和控制選項(例如 IPC_CREAT | IPC_EXCL | 0666)。
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;
arg.val = // 初始值;
if (semctl(semid, 0, SETVAL, arg) == -1) {
perror("semctl");
exit(1);
}
struct sembuf sops[2];
// 等待信號量
sops[0].sem_num = // 信號量編號;
sops[0].sem_op = -1; // 減 1
sops[0].sem_flg = SEM_UNDO; // 如果進程意外終止,則將信號量的值還原
// 發送信號量
sops[1].sem_num = // 信號量編號;
sops[1].sem_op = 1; // 加 1
sops[1].sem_flg = SEM_UNDO;
if (semop(semid, sops, 2) == -1) {
perror("semop");
exit(1);
}
if (semctl(semid, 0, IPC_RMID, NULL) == -1) {
perror("semctl");
exit(1);
}
注意:在使用信號量之前,請確保已經正確地創建和初始化了信號量集。同樣,在完成對信號量的操作后,不要忘記刪除信號量集以避免資源泄漏。