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:
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
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); }
Merci de m'aider si vous voyez d'où vient le problème !
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"); } }
Fate_B
Partager