【问题标题】:How to use the same semaphore between program executions?如何在程序执行之间使用相同的信号量?
【发布时间】:2012-04-28 02:37:08
【问题描述】:

我有一个简单的程序,它只使用一个进程(每次执行时),创建一个带有文件名键的信号量(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 个进程并让它们在同一个程序中一个接一个地写入文件……或者这是唯一的方法吗?

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

【问题讨论】:

  • windows/linux/mac ??
  • 这是在 Mac 上,但它也可以在 Linux 上运行。
  • @Lovato 你能告诉我们 create_semaphore 是如何实现的吗?
  • @PavanManjunath 这就是它的实现方式:int create_semaphore(int k, int n_resources) { key_t key = k; int semid; union semun arg; if ((semid = semget(key, 1, IPC_CREAT | 0666)) == -1) { perror("semget"); exit(1); } arg.val = n_resources; if (semctl(semid, 0, SETVAL, arg) == -1) { perror("semctl"); exit(1); } return semid; }
  • 作业是这样写的: 编写一个程序: 1. 在文本文件中写入一行; 2. 保证互斥; 3.文件最多只能包含10行。这意味着如果你运行程序,如果第一个信号量不能递减,它不应该写任何东西。

标签: c


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2023-01-29
    • 2013-05-21
    • 2020-09-22
    • 2017-02-06
    • 2015-05-27
    相关资源
    最近更新 更多