C中的信号量用于共享内存无法初始化

时间:2014-04-25 16:43:05

标签: c semaphore

命令semctl始终返回-1(在控制台中返回“Fail2”)。我做错了什么?

union semun{
    int val;
    struct semid_ds *buf;
    unsigned short int *array;
    struct seminfo *__buf;
} forsem;
forsem.val = 0;


int sem;
if((sem= semget(key, 1, 0666 | IPC_CREAT) == -1)) {
    fprintf(stderr, "Fail1");
}

if (semctl(sem, 0, SETVAL, forsem) == -1) {
    fprintf(stderr, "Fail2");
}

Errno写Invalid argument

2 个答案:

答案 0 :(得分:1)

你犯了一个简单的错误:

if((sem= semget(key, 1, 0666 | IPC_CREAT) == -1)) { fprintf(stderr, "Fail1"); }

你应该写

if((sem= semget(key, 1, 0666 | IPC_CREAT)) == -1) { fprintf(stderr, "Fail1"); }

注意括号?

顺便说一下,错误为EIDRM,因为代码中sem为0,而不是Invalid Argument

答案 1 :(得分:0)

感谢您的回答!不要紧。唯一没有给出错误的是semctl,第二个参数为0(信号量集中信号量的数量),如果我在其中放置1或30,则返回-1。