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 :

Problème avec les tubes fifo


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Par défaut Problème avec les tubes fifo
    Bonjour à tous,
    j'ai un problème concernant les tubes fifo.

    Avant de mettre le code, je vous explique ce que je veux faire:
    - un processus A créé un fifo, l'ouvre en écriture et y stocke son pid.Il attend ensuite le signal USR1 pour afficher son pid et le signal,puis il quitte.
    - un processus B qui ouvre le fifo en lecture, regarde le PID de A stocké dedans, et envoi à ce pid le signal USR1.

    Les 2 fichiers compilent, mais ne marchent pas...
    Je soupçonne les lignes d'ouverture d'être à l'origine du problème.


    Process A:
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    //Inclusion des bibliothèques.
    #include <unistd.h>
    #include <signal.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdlib.h>
    #include <fcntl.h>
    
    // pointeur sur la fonction PtrFct
    typedef void (* PtrFct)(int) ;
    
    void traiterUSR1(int idSig) ; 
    
    int main()
    {	
    	//Retour de la fonction.
    	PtrFct retFct;
    	
    	//On crée le tube  uniquement s'il n'existe pas déjà.
    	int res,leFIFO,lePID;
    	res=mkfifo("leTuba.FIFO",0666);
    	printf("CREATION");
    	//Vérification que ça s'est bien passé.
    	if (res==-1)
    	{
    		perror("Erreur lors de la création du fifo.");
    		exit(1);
    	}
    	printf("Et ici ?");
    	//On ouvre le FIFO en écriture seulement.
    	leFIFO=open("leTuba.FIFO", O_WRONLY);
    	//On teste si ça s'est bien passé.
    	if (leFIFO==-1)
    	{
    		perror("Erreur lors de l'ouverture en écriture du FIFO.");
    		exit(1);
    	}
    	printf("OUVERTURE\n");
    	
    	//On remplit le tube avec le PID du process.
    	lePID=getpid();
    	write(leFIFO, &lePID, sizeof(lePID)+1);
    	printf("ECRITURE.\n");
    	//On ferme le FIFO.
    	close(leFIFO);	
    
    	while (1)
    	{
    		retFct = signal(SIGUSR1,traiterUSR1);
    		if (retFct == SIG_ERR)
    		{
    			perror("Erreur de signal.\n");
    			exit(1) ;
    		}
    
    	}
    	
    	
    }
    
    void traiterUSR1(int idSig)
    {
    	
    	printf("Le PID est égal à : %d \n",getpid()) ;
    	printf("Le numéro de signal est: %d \n", idSig);
    	exit(0);
    }
    Process B:
    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
    //Inclusion des bibliothèques.
    
    #include <unistd.h>
    #include <signal.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <fcntl.h>
    
    
    int main()
    {	//Ouverture du fifo.
    	int leFIFO,lePID;
    	char * tampon;
    	printf("Ouverture");
    	leFIFO=open("leTuba.FIFO",O_RDONLY);
    	printf("Ca marche");
    	//Vérification de l'ouverture.
    	if (leFIFO==-1)
    	{
    		perror("Erreur lors de l'ouverture en lecture du FIFO.");
    		exit(1);
    	}
    	//On recherche ensuit le PID du process à killer.
    	lePID=read(leFIFO, tampon, sizeof(int));
    	//Appel à la fonction kill et test si c'est correct.
    	if (kill(lePID,10)==0)
    	{
    	}
    	else
    	{
    		//Si la commande a échoué.
    		printf("Probleme d'envoi de signal.\n");
    	}
    
    }
    Merci de m'aider si vous voyez d'où vient le problème !

    Fate_B

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Par défaut
    Personne ?

Discussions similaires

  1. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  2. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par Invité dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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