我在Ubuntu 14.04服务器上玩System V信号量。每当我调用semget()
时,要么创建或访问现有的信号量,都会返回零值。根据{{1}}的手册页,“如果成功,返回值将是信号量集标识符(非负整数),否则返回-1,其中errno表示错误。”
我确认sempahore实际上是通过运行semget
命令创建的。
ipcs -s
所以在我的情况下,我相信------ Semaphore Arrays --------
key semid owner perms nsems
0x00000002 720903 myuser 666 1
应该返回720903而不是0。
这是我的代码:
semget()
这是输出
static void create_sem(void)
{
int key = 2;
int nsems = 1;
int sem_id;
printf("Attempting to create new semaphore set with %d members\n", nsems);
if(sem_id = semget((key_t)key, nsems, IPC_CREAT|IPC_EXCL|0666) == -1) {
printf("Error creating semaphore\n");
exit(1);
}
printf("Successfully created semaphore %d for key %d\n",
sem_id, key);
if(semctl(sem_id, 0, IPC_RMID, 0) == -1) {
perror("Error destorying semaphore");
exit(1);
}
}
注意,如果我通过发出Attempting to create new semaphore set with 1 members
Successfully created semaphore 0 for key 2
Error destroying semaphore: Operation not permitted
对我看到的semid进行硬编码,我可以使用ipcs -s
成功删除信号量数组。
为什么semctl(720903, 0, IPC_RMID, 0)
返回0而不是实际的半音?