所以老师给了我们这个任务,她已经给了我们一些程序来创建信号量以及其他一些程序。我可以使用该过程创建一个信号量,但不能做多于一个,它在尝试创建第二个时显示错误。我真的试图寻找一个解决方案,但我甚至找不到类似程序的代码。我应该在“sem_create”程序中改变什么?
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int sem_create(key_t CLEF,int initval) {
union semun {
int val;
struct semid_ds *buf;
ushort *array;
} arg_ctl;
int semid;
semid = semget(ftok("Disjktra.h<votre login>",CLEF),
1, IPC_CREAT|IPC_EXCL|0666);
if (semid == -1)
return -1;
arg_ctl.val = initval; // sth is missing here
if (semctl(semid, 0, SETVAL, arg_ctl) == -1)
return -1;
return semid;
}
/////////////////////////////////
/////////////////////////////////
void main() {
int i, CLE=33, S1=0, S2=0;
if ((S1 = sem_create(CLE,0)) == -1) {
perror("error in creating semaphore 1");
exit(-1);
}
if ((S2 = sem_create(CLE,0)) == -1) {
perror("error in creating semaphore 2");
exit(-1);
}
}
输出:
error in creating semaphore 2 :File exists
答案 0 :(得分:1)
根据Linux manual page for semget(2):
如果 semflg 同时指定
IPC_CREAT
和IPC_EXCL
并且 key 已存在信号量集,则semget()
将失败并带有< em> errno 设置为EEXIST
。
这似乎很清楚。您的sem_create
函数调用semget
来创建“Disjktra.h”信号量,但前提是它还不存在。你不能在同一个程序中做两次。
修改:还请注意 ftok(3)手册页:
指定的路径必须指定调用进程可访问的现有文件,否则调用将失败。
我相信如果您检查ftok
的结果,您会发现它无法为任何一个信号量生成有效密钥:
key_t semkey = ftok("Disjktra.h<votre login>",CLEF);
if (semkey < 0) {
perror("error creating key");
return -1;
}
基于此,我建议使用真实文件作为ftok
的路径名,或完全放弃ftok
并每次使用semget(IPC_PRIVATE, ...)
创建私人信号量。
另一方面,你的代码很难理解它的格式化方式。请考虑清理代码,以便在发布问题时更容易阅读。
答案 1 :(得分:0)
信号量排他性
第一次:
semget()返回信号量的ID。和支票看
如果该值大于0,则结果为真
执行打印ID的printf()
第二次
下一次回合返回的值b semget()是什么
小于0表示信号量已存在。
结果执行了perror()函数。
原因是:文件存在