我有一个简单的程序,它只使用一个进程(每次执行时),创建一个带有文件名(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 个进程并让它们在同一个程序中一个一个地写入文件......或者这是唯一的方法吗?
PS 该create_semaphore()
函数是我的semaphores.h
头文件的一部分,其中包含我编写的 4 个简单函数,因此使用信号量更容易,而不是每次我想使用它们时都运行所有 semget、semop 和 semctl 的东西。