如何在程序执行之间使用相同的信号量?

时间:2012-04-16 18:35:21

标签: c

我有一个只使用一个进程的简单程序(每次执行时),创建一个信号量,其中的密钥是文件的名称(ftok()函数),然后将一行写入文件。问题是,信号量(在这种情况下,2)必须做两件事:一个必须保证不超过两个程序同时写入,另一个必须验证最多只有10行被写入文件。因此,如果我执行该程序并且该文件已有10行文本,则不会向其写入任何内容。

这是我的代码:

#include "semaphores.h"

int main() {
    int semaphoreLines = create_semaphore(ftok("Ex5.c", 0), 10);
    int semaphoreWrite = create_semaphore(ftok("Ex5.c", 1), 1);
    FILE *file;

    int ret_val = down(semaphoreLines, 1);
    if(ret_val != 0) {
        printf("No more lines can be written to the file!\n");
        exit(-1);
    }

    down(semaphoreWrite, 1);
    file = fopen("Ex5.txt", "a");
    fprintf(file, "This is process %d\n", getpid());
    fclose(file);
    up(semaphoreWrite, 1);
    return 0;
}

当我第一次执行它时,semaphoreLines转到9(按预期),将semaphoreWrite锁定为0(因此没有其他进程可以写入文件),然后写入并释放后者回到1.过程终止。我手动告诉它在终端再次运行。但是,semaphoreLines应为9,因此当我down()时,它会变为8,依此类推。问题是,它再次恢复到10。我不想要这个。

也许是因为我对信号量编程相当新,但我认为信号量是公共的,如果它们不是用0键创建的。使用ftok(),我希望它是公共的,这样如果我再次运行程序,它会尽可能减少它并写入,如果不是,它会显示错误代码并终止。我的意思是,信号量没有被删除,所以第二次程序执行时它应该看到信号量值是9,对吧......?

我真的不想分叉10个进程并让它们逐个写入同一程序中的文件......或者这是唯一的方法吗?

P.S。 create_semaphore()函数是我的semaphores.h头文件的一部分,它包含我编写的4个简单函数,因此每次我想工作时都更容易使用信号量而不是运行所有semget,semop和semctl和他们一起。

1 个答案:

答案 0 :(得分:0)

  

问题是,它再次恢复到10。我不想要这个。

如果你不想要这个,那就不要这样做。您自己在create_semaphore()中将信号量值设置为10。相反,除了IPC_CREAT之外,还要将IPC_EXCL传递给semget(),如果这会产生错误的EEXIST,只需从create_semaphore()返回并跳过semctl(SETVAL)

相关问题