命令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
答案 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。