创建多个信号量时出错

时间:2013-12-07 20:10:40

标签: c semaphore

所以老师给了我们这个任务,她已经给了我们一些程序来创建信号量以及其他一些程序。我可以使用该过程创建一个信号量,但不能做多于一个,它在尝试创建第二个时显示错误。我真的试图寻找一个解决方案,但我甚至找不到类似程序的代码。我应该在“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

2 个答案:

答案 0 :(得分:1)

根据Linux manual page for semget(2):

  

如果 semflg 同时指定IPC_CREATIPC_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()函数。

原因是:文件存在