ecrire la commande tee en c
ecrire la commande tee en c
Bonjour,
Est-ce un exercice scolaire ?
Parce qu'autrement, tout ce que tu nous décris là, c'est l'objet de la commande tee :
Code Shell : 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
69 $ echo Hello | tee tmp Hello $ cat tmp Hello $ tr a-z A-Z | tee tmp hello HELLO $ cat tmp HELLO $ tee tmp | gnuplot 2>&1 | tee -a tmp set term dumb plot sin(x) 1 ++---------------***--------------+---***----------+--------**-----++ + *+ * + * * + sin(x) ****** + 0.8 ++ * * * * * * ++ | * * * * * * | 0.6 ++ * * * * * * ++ * * * * * * * | 0.4 +* * * * * * * ++ |* * * * * * * | 0.2 +* * * * * * * ++ | * * * * * * * | 0 ++* * * * * * *++ | * * * * * * *| -0.2 ++ * * * * * * *+ | * * * * * * *| -0.4 ++ * * * * * * *+ | * * * * * * * -0.6 ++ * * * * * * ++ | * * * * * * | -0.8 ++ * * * * * * ++ + ** * + * * + * +* + -1 ++-----**--------+----------***---+--------------***---------------++ -10 -5 0 5 10 <Ctrl-D> $ cat tmp set term dumb plot sin(x) 1 ++---------------***--------------+---***----------+--------**-----++ + *+ * + * * + sin(x) ****** + 0.8 ++ * * * * * * ++ | * * * * * * | 0.6 ++ * * * * * * ++ * * * * * * * | 0.4 +* * * * * * * ++ |* * * * * * * | 0.2 +* * * * * * * ++ | * * * * * * * | 0 ++* * * * * * *++ | * * * * * * *| -0.2 ++ * * * * * * *+ | * * * * * * *| -0.4 ++ * * * * * * *+ | * * * * * * * -0.6 ++ * * * * * * ++ | * * * * * * | -0.8 ++ * * * * * * ++ + ** * + * * + * +* + -1 ++-----**--------+----------***---+--------------***---------------++ -10 -5 0 5 10
Tu as des copains d'école qui trainent sur ce forum on dirait.
Tu fais une boucle infinie qui poll() stdin et les 3 pipes connectés au stdin, stout et stderr du fils. A chaque tour tu regarde quels fd sont prêts :
- Si stdin est prêt, tu le lit et tu ajoutes les données lues dans un buffer. Si le read() renvoie 0 (ou le fread() renvoie EOF), ça veut dire qu'il n'y a plus de données, donc tu ferme le pipe connecté au stdin du fils.
- Si le pipe connecté au stdin du fil est prêt, tu y envoies les données présentes dans le buffer,. Attention tu ne sera pas forcément capable d'envoyer l'intégralité des données, donc regarde bien combien de données ont été envoyées (c'est le nombre retourné par write()) pour faire avancer ta "position courante" d'autant dans le buffer d'envoi. Tu écris aussi dans le fichier les données que tu viens d'envoyer.
- Si le pipe connecté au stdout du fil est prêt, tu lit les données et tu les écris dans le fichier. Si le read() renvoie 0, ça veut dire qu'il n'y a plus de données, et tu peux clore le fd.
- Pareil pour le pipe connecté au stderr du fils.
Enfin, quand tu n'as plus de fd à scruter (c'est à dire quand tous auront été fermé), tu fais un wait() pour récupérer le status du fils.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager