我有以下代码来测试信号量是否正常工作;
#include <stdio.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/sem.h>
#include <pthread.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
int semID;
int i = -1;
struct sembuf sem_buf;
void * spawn(void * params){
printf("semID: %d\n", semID);
semop(semID, &sem_buf, 1);
printf("i: %d\n", i);
shmctl(semID, 0, IPC_RMID);
return NULL;
}
int main(int argc, char const *argv[])
{
sem_buf.sem_num = 0;
sem_buf.sem_op = -1;
sem_buf.sem_flg = SEM_UNDO;
semID = semget(IPC_PRIVATE, 4, IPC_CREAT);
printf("semID: %d\n", semID);
semctl(semID, 0, SETALL);
switch(errno){
case EACCES:
printf("EACCES\n");
shmctl(semID, 0, IPC_RMID);
//return 0;
break;
case EEXIST:
printf("EEXIST\n");
shmctl(semID, 0, IPC_RMID);
return 0;
break;
case EINVAL:
printf("EINVAL\n");
shmctl(semID, 0, IPC_RMID);
return 0;
break;
case ENOENT:
printf("ENOENT\n");
shmctl(semID, 0, IPC_RMID);
return 0;
break;
case ENOSPC:
printf("ENOSPC\n");
shmctl(semID, 0, IPC_RMID);
return 0;
break;
}
pthread_t threadID;
pthread_create(&threadID, NULL, spawn, NULL);
sleep(1);
printf("i is becoming 72.\n");
i = 72;
sem_buf.sem_num = 0;
sem_buf.sem_op = 1;
sem_buf.sem_flg = SEM_UNDO;
return 0;
}
当我以root身份运行时,我有以下输出;
semID: 262144
semID: 262144
i: -1
i is becoming 72.
所以线程不是在等待信号量,但为什么会这样呢?代码出了什么问题?
我知道未命名的信号量,即 sem_init()和 sem_destroy(),在Mac OSX上不起作用,但在这里我们使用 setget( )等等。
编辑: 更改 semop()函数的第三个参数后,正如@Someprogrammerdude建议的那样,它有效,但仍然存在问题。在创建信号量时,如果我将零作为第二个参数,则返回 EINVAL ,但我检查了管理,但没有发生EINVAL错误的原因。那么这个案例有什么问题?