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

  • 本文关键字:信号量 之间 程序 执行 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 %dn", getpid());
    fclose(file);
    up(semaphoreWrite, 1);
    return 0;
}

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

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

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

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

问题是,它再次回到 10 点。我不要这个。

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

最新更新