第1个回答 2022-09-26
// 系统信号量初始化接口:
// int semctl(int semid, int semnum, int cmd, ... /* union semun arg */);
// 第四个参数的具体定义一般格式(在有的linux中有预先定义好的
// 但大多数linux需要用户自己定义):
union semun {
int val;
struct semid_ds *buf;
unsigned int *array;
};
// 使用:
// 1)只创建一个信号量
int semval = 1; // 信号量值,大小自定,单独定义一下,方便后面赋值给不同的共用体形式
union semun su; // 定义共用体
int semid = semget(IPC_PRIVATE, 1, 0640 | IPC_CREAT); // 先创建信号量
su.val = semval; // 使用共用体的val进行传参
semctl(semid, 1, SETVAL, su); // 初始化信号量
// 此处省略PV操作
semctl(semid, 1, IPC_RMID); // 删除信号量
// 或者
// 2)创建一组信号量
int n = 5 // 个数自定
semid = semget(IPC_PRIVATE, n, 0640 | IPC_CREAT); // 先创建信号量
int array[n]; // VLA
int *p = array;
for (int i = 0; i < n; ++i) {
*p++ = semval;
}
su.array = array;
semctl(semid, n, SETALL, su); // 初始化信号量
// 此处省略PV操作
semctl(semid, 1, IPC_RMID); // 删除信号量