2012-04-16 6 views
0

J'ai un programme simple qui utilise seulement un processus (chaque fois qu'il est exécuté), crée un sémaphore avec une clé qui est le nom du fichier (fonction ftok()), puis écrit une ligne dans un fichier. Le fait est que les sémaphores (dans ce cas, 2) doivent faire deux choses: il faut garantir que pas plus de deux programmes écrivent en même temps, et que l'autre doit vérifier que seulement 10 lignes maximum ont été écrites le fichier. Donc, si j'exécute le programme et que le fichier contient déjà 10 lignes de texte, il n'y écrira rien.Comment utiliser le même sémaphore entre les exécutions de programme?

Ceci est mon code:

#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; 
} 

Quand je l'exécute la première fois, semaphoreLines va à 9 (comme prévu), verrouille le semaphoreWrite-0 (donc aucun autre processus peut écrire dans le fichier), puis écrit et libère ce dernier à 1. Le processus se termine. Je lui dis manuellement de se relancer dans Terminal. Cependant, semaphoreLines devrait être 9 alors quand je down() il, il va à 8 et ainsi de suite. Le problème est, il se remet à 10 à nouveau. Je ne veux pas ça. Peut-être que c'est parce que je suis relativement nouveau dans la programmation des sémaphores, mais je pensais que les sémaphores étaient publiques s'ils n'étaient pas créés avec la touche 0. Avec le ftok(), je voulais qu'il soit public de sorte que si je relance le programme il le décrémente si possible et écrit, sinon il affiche le code d'erreur et se termine. Je veux dire, le sémaphore n'est pas supprimé, donc la deuxième fois que le programme est exécuté, il devrait voir la valeur du sémaphore est 9, n'est-ce pas ...?

Je ne veux pas vraiment entamer 10 processus et les faire écrire un par un dans le fichier dans le même programme ... ou est-ce la seule façon de le faire?

P.S. La fonction create_semaphore() fait partie de mon fichier d'en-tête semaphores.h, qui contient 4 fonctions simples que j'ai écrites, il est donc plus facile d'utiliser des sémaphores au lieu d'exécuter tous ces semget, semop et semctl chaque fois que je veux travailler avec eux.

+0

windows/linux/mac ?? – MByD

+0

Ceci est sur Mac, mais cela fonctionnerait aussi sous Linux. – swiftcode

+1

@Lovato Pouvez-vous nous montrer comment est implémenté create_semaphore? –

Répondre

0

Le problème est, il se remet à 10 à nouveau. Je ne veux pas ça.

Si vous ne le souhaitez pas, ne le faites pas. Vous définissez vous-même la valeur du sémaphore sur 10 à create_semaphore(). Au lieu de cela, passez IPC_EXCL en plus de IPC_CREAT à semget(), et si cela renvoie errno EEXIST, renvoyez simplement create_semaphore() et ignorez le semctl(SETVAL).

Questions connexes