Deutsch   English   Français   Italiano  
<u2tbbd$3un10$1@paganini.bofh.team>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!feeds.phibee-telecom.net!weretis.net!feeder8.news.weretis.net!paganini.bofh.team!not-for-mail
From: Francois LE COAT <lecoat@atari.org>
Newsgroups: fr.comp.sys.atari
Subject: =?UTF-8?Q?Re:_fork=28=29_sous_Multitos_question_=c3=a0_Fran=c3=a7oi?=
 =?UTF-8?Q?s?=
Date: Wed, 3 May 2023 12:00:13 +0200
Organization: To protect and to server
Message-ID: <u2tbbd$3un10$1@paganini.bofh.team>
References: <M8e3pvNp4cbQ8PseiWxbN_ORsQs@jntp>
 <81f7a286-e4ae-495c-9527-d15d720575a1n@googlegroups.com>
 <PkoV1QHwjG6i89kf67QK2xCcllk@jntp>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: quoted-printable
Injection-Date: Wed, 3 May 2023 10:00:13 -0000 (UTC)
Injection-Info: paganini.bofh.team; logging-data="4152352"; posting-host="FA92OzQsKw/evhUqc0ALDw.user.paganini.bofh.team"; mail-complaints-to="usenet@bofh.team"; posting-account="9dIQLXBM7WM9KzA+yjdR4A";
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:91.0)
 Gecko/20100101 SeaMonkey/2.53.16
Cancel-Lock: sha256:E73gTk7CGW2S1MCj1W8A9SJewNS1xcbzgEcrXVJZHdM=
X-Notice: Filtered by postfilter v. 0.9.3
Bytes: 5060
Lines: 99

Salut,

Tu as la r=E9action d'un b=E9otien =E0 qui l'on n'a pas appris =E0 lire u=
n
programme parall=E8le. Il y a deux fork() et donc deux processus
fils et petit-fils qui sont cr=E9=E9s. Ils communiquent par un canal
d=E9di=E9. Il faut bien attendre (sans rien faire), sinon la fin du
processus p=E8re, met fin aux deux processus fils et petit-fils.

Le processus fils lance la commande `who` sans aucun argument
avec la commande execlp(). Le processus petit-fils lance la
commande `wc` sans aucun argument avec la commande execlp().
La sortie standard de `who` est redirig=E9e vers l'entr=E9e standard
de `wc`.

`who` g=E9n=E8re une liste de mots, qui correspondent =E0 chacun des
noms des utilisateurs de la machine Unix. `wc` compte ces mots.
La sortie r=E9sultat des deux processus, est le nombre d'utilisateurs.

Tu peux lancer `who` sous freeMiNT. Tu peux aussi lancer `wc`.
Tu peux enfin lancer la commande `who|wc`. Si tu compiles le
programme et que tu le lances, il te donnera le m=EAme r=E9sultat.

C'est magique =3D)

OL =E9crit=A0:
> c'est correcte, je suppose que tu as fait expr=E8s d'attendre si par=20
> exemple tu veux faire autre chose apr=E8s sinon c'est compliqu=E9 pour =
rien.=20
> Bon ce n'est pas ce que tu nous avais vendu, je suis d=E9=E7u, j'attend=
ais=20
> l'utilisation de threads comme tu l'avais annonc=E9 ici ce n'est pas du=
=20
> tout le cas, c'est juste une redirection des entr=E9e sortie pour singe=
r=20
> le shell, les fonctions execlp() cl=F4turent le thread, il n'y a aucun =

> multit=E2che l=E0 dedans. Par contre cela illustre bien les redirection=
s que=20
> l'on peut faire en Unix
>=20
>> /*
>> =A0* Programme who|wc : compte le nombre d'utilisateurs
>> =A0*/
>>
>> #include <stdio.h>
>> #include <unistd.h>
>>
>> void main(void);
>>
>> int p[2]; /* Identificateurs des canaux de communication */
>>
>> void main()
>> =A0=A0=A0=A0{
>> =A0=A0=A0=A0int pid; /* Identificateur des processus */
>>
>> =A0=A0=A0=A0 if(pipe(p)!=3D0)
>> =A0=A0=A0=A0=A0=A0=A0=A0 {
>> =A0=A0=A0=A0=A0=A0=A0 perror("\nCreation d'un canal impossible\n");
>> =A0=A0=A0=A0=A0=A0=A0 exit(1);
>> =A0=A0=A0=A0=A0=A0=A0 }
>>
>> =A0=A0=A0=A0pid=3Dfork();
>> =A0=A0=A0=A0 if(pid=3D=3D0)
>> =A0=A0=A0=A0=A0=A0=A0=A0 { /* Processus PERE : Il execute "who" */
>> =A0=A0=A0=A0=A0=A0=A0 close(1); /* Fermeture de la sortie standard */
>> =A0=A0=A0=A0=A0=A0=A0 dup(p[1]) /* Duplique la sortie du pere en sorti=
e standard */
>> =A0=A0=A0=A0=A0=A0=A0 close(p[0]); /* L'entree du pere ne sert plus a =
rien */
>> =A0=A0=A0=A0=A0=A0=A0 close(p[1]); /* La sortie non plus */
>> =A0=A0=A0=A0=A0=A0=A0 execlp("who","who",NULL);
>> =A0=A0=A0=A0=A0=A0=A0 }
>> =A0=A0=A0=A0else if(pid<0)
>> =A0=A0=A0=A0=A0=A0=A0=A0 {
>> =A0=A0=A0=A0=A0=A0=A0 perror("\nFork impossible\n");
>> =A0=A0=A0=A0=A0=A0=A0 }
>> /* Processus Fils : il execute a nouveau un fork */
>> =A0=A0=A0=A0pid=3Dfork();
>> =A0=A0=A0=A0 if(pid=3D=3D0)
>> =A0=A0=A0=A0=A0=A0=A0=A0 { /* Processus PERE : Il execute "wc" */
>> =A0=A0=A0=A0=A0=A0=A0 close(0); /* Fermeture de l'entree standard */
>> =A0=A0=A0=A0=A0=A0=A0 dup(p[0]) /* Duplique l'entree du pere en entree=
 standard */
>> =A0=A0=A0=A0=A0=A0=A0 close(p[0]); /* L'entree du pere ne sert plus a =
rien */
>> =A0=A0=A0=A0=A0=A0=A0 close(p[1]); /* La sortie non plus */
>> =A0=A0=A0=A0=A0=A0=A0 execlp("wc","wc",NULL);
>> =A0=A0=A0=A0=A0=A0=A0 }
>> =A0=A0=A0=A0else if(pid<0)
>> =A0=A0=A0=A0=A0=A0=A0=A0 {
>> =A0=A0=A0=A0=A0=A0=A0 perror("\nFork impossible\n");
>> =A0=A0=A0=A0=A0=A0=A0 }
>> /* Processus Fils : Attend la fin des deux processus */
>> =A0=A0=A0=A0close(p[0]); /* L'entree du fils ne sert plus a rien */
>> =A0=A0=A0=A0close(p[1]); /* La sortie non plus */
>> =A0=A0=A0=A0while(wait()>=3D0);
>> =A0=A0=A0=A0 exit(0);
>> =A0=A0=A0=A0}