IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Accès exclusif à un fichier grace à sémaphore


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Accès exclusif à un fichier grace à sémaphore
    Bonjour,
    voici la situation :

    j'ai 2 processus qui doivent faire des write en même temps dans un tube nommé. Ces 2 processus n'ont pas de relation père/fils.

    Y'a t'il un moyen d'utiliser des sémaphores nommés pour garantir un accès exclusif à la ressource ?

    Si oui, comment ?

    Merci

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Il suffit d'utiliser les fonctions gerant les semaphores...

    man semget, semop...

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Sans trop rentrer dans les details, j'ai trouve ce site qui explique les semaphores:
    http://www.cs.cf.ac.uk/Dave/C/node26...00000000000000

    Et j'ai fais une version simple en francais (largement inspire de ce site!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/sem.h>
     
    int main()
    {
    	//On recupere un semaphore
    	key_t key = 1234; //Pourquoi pas ca comme cle?
    	int flag=IPC_CREAT|0666; //tout le monde aura le droit sur ce semaphore
    	int nsems = 1; //on veut un semaphore
    	struct sembuf sops[2];
     
    	int semid = semget(key,nsems,flag);
     
    	if(semid==-1)
    	{
    		perror("erreur avec semid\n");
    		return 1;
    	}
     
    	//On veut le semaphore
    	//D'abord on attend qu'il soit a 0
    	sops[0].sem_num = 0;
    	sops[0].sem_op = 0;
    	sops[0].sem_flg = SEM_UNDO;
     
    	//Ensuite on prend le controle
    	sops[1].sem_num = 0;
    	sops[1].sem_op = 1;
    	sops[1].sem_flg = SEM_UNDO|IPC_NOWAIT;
     
    	if (semop(semid, sops, 2) == -1) 
    	  {
    	  perror("Semop a echoue");
    	  return 1;
    	  }
     
    	//On a pris le controle
    	printf("On a le controle!!!\n");
    	//On attend 5 secondes
    	sleep(5);
     
    	printf("On le rend...\n");
     
    	//On decrement le semaphore pour rendre la main
    	sops[0].sem_num = 0;
    	sops[0].sem_op = -1;
    	sops[0].sem_flg = SEM_UNDO|IPC_NOWAIT;
     
    	if (semop(semid, sops, 1) == -1) 
    	  {
    	  perror("Semop a echoue");
    	  return 1;
    	  }
     
    	return 0;
    }
    Si t'as des questions par rapport au code, poses-les!

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci pour ton exemle, il est beaucoup plus clair que tout ce que j'avais trouvé avant.

    J'ai quand même 2 p'tites questions pour toi :

    Si je lance les 2 processus en même temps, comment se fait-il que dans le cas du deuxième arrivé, ça bloque pas avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	//On veut le semaphore
    	//D'abord on attend qu'il soit a 0
    	sops[0].sem_num = 0;
    	sops[0].sem_op = 0;
    	sops[0].sem_flg = SEM_UNDO;
    mais seulement avant cette partie ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	//Ensuite on prend le controle
    	sops[1].sem_num = 0;
    	sops[1].sem_op = 1;
    	sops[1].sem_flg = SEM_UNDO | IPC_NOWAIT;
    Autre question, pourquoi mettre IPC_NOWAIT ? alors que c'est quand même bloquant ?

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Si je lance les 2 processus en même temps, comment se fait-il que dans le cas du deuxième arrivé, ça bloque pas avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     //On veut le semaphore
       //D'abord on attend qu'il soit a 0
       sops[0].sem_num = 0;
       sops[0].sem_op = 0;
       sops[0].sem_flg = SEM_UNDO;
    mais seulement avant cette partie ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       //Ensuite on prend le controle
       sops[1].sem_num = 0;
       sops[1].sem_op = 1;
       sops[1].sem_flg = SEM_UNDO | IPC_NOWAIT;
    Ce n'est pas vrai, si tu lances deux processus, le premier prendra contrôle du sémphore, l'autre se verra bloquer à cet endroit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (semop(semid, sops, 2) == -1)

    Autre question, pourquoi mettre IPC_NOWAIT ? alors que c'est quand même bloquant ?
    En fait, il faut voir chaque opération comme indépendante. Ce qui ne veut pas dire que semop le considére comme tel. En effet, semop exécute les opérations que si tous les opérations peuvent être exécutées.

    La première opération:

    //On veut le semaphore
    //D'abord on attend qu'il soit a 0
    sops[0].sem_num = 0;
    sops[0].sem_op = 0;
    sops[0].sem_flg = SEM_UNDO;
    Permet de dire: "attend jusqu'à ce que la valeur du sémaphore soit nulle"

    Ensuite,

    //Ensuite on prend le controle
    sops[1].sem_num = 0;
    sops[1].sem_op = 1;
    sops[1].sem_flg = SEM_UNDO | IPC_NOWAIT;
    Permet de dire: ajoute 1 à la valeur du sémaphore, par contre, ce n'est pas la peine d'attendre... Mais vu qu'on a été bloqué à cause de la première opération, on sait que cette opération va s'accomplir avec succès (vu que les opérations sont faites de facon atomique)

    Jc

    Autre référence:
    http://monge.univ-mlv.fr/~roussel/INTERFACE/8.4.html

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. HELP : pb de repartage de fichier apres un accès Exclusif
    Par gdecomb dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/07/2007, 10h41
  2. Un fichier a accés exclusif
    Par spekal dans le forum Administration système
    Réponses: 2
    Dernier message: 12/09/2006, 08h19
  3. Réponses: 5
    Dernier message: 07/05/2004, 09h44
  4. problème d'acces concurentiel à un fichier
    Par Theoden dans le forum MFC
    Réponses: 2
    Dernier message: 04/03/2004, 09h49
  5. Chemin d'accès d'un fichier
    Par guitaros dans le forum Langage
    Réponses: 6
    Dernier message: 16/01/2004, 09h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo