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

C 如何在程序执行之间使用相同的信号量?,c,C,我有一个简单的程序,它只使用一个进程(每次执行一个进程),创建一个带有文件名键的信号量(ftok()函数),然后向文件写入一行。问题是,信号量(在本例中为2)必须做两件事:一件必须保证不超过两个程序同时写入,另一件必须验证文件中最多只写入了10行。因此,如果我执行程序,文件已经有10行文本,它将不会写入任何内容 这是我的代码: #include "semaphores.h" int main() { int semaphoreLines = create_semaphore(ftok(

我有一个简单的程序,它只使用一个进程(每次执行一个进程),创建一个带有文件名键的信号量(
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(按预期),将
semaphoreliewrite
锁定为0(因此其他进程无法写入该文件),然后将后者写入并释放回1。进程终止。我手动告诉它在终端中再次运行。但是,
semaphoreLines
应该是9,所以当I
down()时,它会变成8,以此类推。问题是,它又回到了10点。我不要这个

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

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

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

问题是,它又回到了10点。我不要这个


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

windows/linux/mac??这是在mac上的,但是它也可以在Linux上运行。@Lovato你能告诉我们create_信号量是如何实现的吗?@PavanManjunath这就是它的实现方式:
int create_信号量(int k,int n_resources){key_t key=k;int semid;union semun arg;if((semid=semget(key,1,IPC_create | 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行。这意味着,如果运行该程序,如果第一个信号量不能递减,它不应该写入任何内容。