Salut mon petit loup
"Béotien" voyons cela, je ne suis pas un habitant de Béotie donc cela ne
doit pas correspondre, je ne suis pas non plus un dialecte de langue grec
ancien, est ce que je dois comprendre qu'il s'agit d'une insulte cultivée
d'homme supérieur?
On va donc partir sur cette hypothèse mais je pense que c'est l'arroseur
qui va être arrosé, alors un peu de technique.
> Salut,
>
> Tu as la réaction d'un béotien à qui l'on n'a pas appris à lire un
> programme parallèle.
Oh si j'ai très bien lu et je comprend très bien.
>Il y a deux fork() et donc deux processus
> fils et petit-fils qui sont créés.
Oui j'ai compris même si je ne suis pas d'accord sur le besoin du 2eme
fork si tu ne veux pas faire d'attente dans le programme père mais on
verra plus tard
>Ils communiquent par un canal
> dédié.
Oui
>Il faut bien attendre (sans rien faire), sinon la fin du
> processus père, met fin aux deux processus fils et petit-fils.
Bah non, ce n'est pas nécessaire c'est que tu t'y prend mal, c'est
beaucoup plus simple que cela
En plus c'est à mon avis totalement faux, le système ne libérera rien
tant que les processus sont en vie pire ce sont 2 process totalement
différent ou tout a été dupliqué il ne s'agit absolument pas de
thread, c'est 2 processus cloisonnés le fork.
Donc si tu ne veux faire qu'afficher who|wc sans récupérer les data et
traiter après cela le second fork ne sert à rien! Tu as compliqué
quelque la chose mais possible que tu ai écrit cela il y a 20 ans et que
tu ai oublié...
A la fin du texte une version simplifiée, cela fait exactement la même
chose sans l'attente et c'est un fork en moins.
>
> Le processus fils lance la commande `who` sans aucun argument
> avec la commande execlp().
Encore une erreur, who est lancé par le fils un détail mais enfin quand
on à la tête comme un melon faut assurer
>Le processus petit-fils lance la
Et là par ricochet c'est donc un second fils qui est créé pas un petit
fils, mais c'est curieux dans la logique ce coup-ci tu ne te trompes pas.
Le reste tout cela j'ai compris et je suis d'accord.
Crois tu que je sois si "béotien" que cela? Mais il me semble que pour le
moment j'ai un point et toi 0
Bon je suis bon joueur, je te propose de te rattraper, si tu arrives à
faire ce défit je veux bien être un béotien et même l'accepter parce
que je ne sais pas faire, attention tous les mots comptent.
Voilà je voudrais créer 2 threads (attention pas un fork qui duplique
complètement le processus donc qui ne partage pas les données) et que
ces 2 threads fassent n'importe quoi (un simple printf par exemple) qui
montre qu'ils manipulent une même variable par exemple qui ajoute 1 dans
un thread et retire 1 dans l'autre. Petite demande supplémentaire que
cela fonctionne sous Unix et Freemint.
Alors juré si cela fonctionne je te tirerais mon chapeau (Nota évites de
demander à ChatGPT!).
Mais là ce que je vois c'est que tu ne sembles pas aussi pointu que ce
que tu sembles dire, pas sans connaissance n'exagérons rien non plus je
ne m'appelle pas FLC pour faire ce genre supériorité.
Bonne nuit.
Voici le code modifié:
/* * Programme who|wc : compte le nombre d'utilisateurs */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
void main(void);
int p[2]; /* Identificateurs des canaux de communication */
void main()
{ int pid; /* Identificateur des processus */
if(pipe(p)!=0)
{ perror("\nCreation d'un canal impossible\n");
exit(1);
}
pid=fork();
if(pid==0)
{ /* Processus FILS : Il execute "who" */
close(1); /* Fermeture de la sortie standard */
dup(p[1]); /* Duplique la sortie du fils en sortie standard */
close(p[0]); /* L'entree du fils ne sert plus a rien */
close(p[1]); /* La sortie non plus */
execlp("who","who",NULL);
}
else
if(pid<0)
{ perror("\nFork impossible\n");
}
/* Processus Père pas besoin de fork c'est stupide pour faire juste
who|wc si on n'a pas besoin d'attendre et de faire autre chose*/
close(0); /* Fermeture de l'entree standard */
dup(p[0]); /* Duplique l'entree du pere en entree standard */
close(p[0]); /* L'entree du pere ne sert plus a rien */
close(p[1]); /* La sortie non plus */
execlp("wc","wc",NULL);
printf("semble que quelque chose s'est mal passé!\n");
exit(1);
}