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:
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:
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