Bonjour à tous,
je vous explique un peu mon projet. Je dois récupérer le PID de Firefox pour le killer. Le prof veut que j'utilise le résultat envoyé par "ps - A | grep firefox-bin", ensuite mon programme récupère le PID dans les lignes et envoie un "kill -9 PID".
Il veut qu'on utilise des fork et des tubes, alors donc, je fais un premier fork, le père ferme la sortie standard et duplique un tube, le résultat de "ps -A" est renvoyée dans le tube, aucun soucis là. Le fils lui fait un second fork et possède un autre tube.
Le pere ferme l'entrée standard et duplique le premier tube ensuite la sortie standard est fermée et le deuxième tube est dupliqué à sa place. Je fais donc ensuite mon execl qui s'opère sur l'entrée et sortie standard, logiquement elle devrai renvoyer dans le tube2 le résultat de "grep entrée_standard firefox-bin".
Dans le fils je fais la lecture du contenu du tube et en fait, le programme se coupe au read(). Pas moyen de récupérer un message d'erreur ni rien, le programme se coupe...
Si je ne ferme pas la sortie standard, le resultat d'execl est conforme à ce que j'attend.
Si je vire le read, le printf qui suit s'affiche bien...
Voici mon code :
Merci de votre aide :p
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 #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #define LECTURE 0 #define ECRITURE 1 int main(int arg, char **argv) { int PID; int PID2; int taille; int tube[2]; int tube2[2]; int res; char buffer[512]; pipe(tube); pipe(tube2); PID = fork(); if (PID == 0) { PID2 = fork(); if (PID2 == 0) { read(tube2[LECTURE], buffer, 512); printf ("Valeur : %s", buffer); scanf ("%*c"); } else { close(LECTURE); dup(tube[LECTURE]); close(ECRITURE); dup(tube2[ECRITURE]); execl("/bin/grep", "/bin/grep", "firefox-bin", NULL); wait(NULL); } } else { close(ECRITURE); dup(tube[ECRITURE]); execl("/bin/ps", "/bin/ps", "-A", NULL); wait (NULL); } return 0; }
Partager