2012-04-16 15 views
0

我有一个简单的程序,只使用一个进程(每次执行时),用一个文件名(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

windows/linux/mac? – MByD 2012-04-16 18:37:54

+0

这是在Mac上,但它也可以在Linux上使用。 – swiftcode 2012-04-16 18:39:39

+1

@Lovato你能告诉我们如何实现create_semaphore? – 2012-04-16 19:05:56

回答

0

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

如果你不想要这个,那么不要这样做。你自己在create_semaphore()中将信号值设置为10。相反,除了IPC_CREAT之外,还要将IPC_EXCL传递到semget(),并且如果产生errno EEXIST,只需从create_semaphore()返回并跳过semctl(SETVAL)即可。

相关问题