我有一个只使用一个进程的简单程序(每次执行时),创建一个信号量,其中的密钥是文件的名称(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和他们一起。
答案 0 :(得分:0)
问题是,它再次恢复到10。我不想要这个。
如果你不想要这个,那就不要这样做。您自己在create_semaphore()
中将信号量值设置为10。相反,除了IPC_CREAT之外,还要将IPC_EXCL传递给semget()
,如果这会产生错误的EEXIST,只需从create_semaphore()
返回并跳过semctl(SETVAL)
。