Re: [SSFR] subshells et pensée globale ?

[ Thread Index | Date Index | More debianworld.org/shellscript-fr Archives ]


Desole si ce message est en double, mais Je l'ai expedie le
trois aout et, Anne ma soeur Anne, je ne vois toujours rien venir...

Salut,

Marc Chantreux a écrit :
> Salut a tous,
> 
> soit f une fonction qui modifie une variable globale x.
> 
> si je capture la sortie de f (ou si j'utilise f dans un pipe), ma
> variable x est modifiée dans le sous-shell (autant dire : pas modifiée)
[snip]
> je peux transmettre mes informations par l'intermediaire de fichiers ou
> de fifo mais j'aimerais savoir si il y a moyen d'eviter le fork.
En utilisant Linux, ca fait clone(1) au lieu de [v]fork(1) ;-)

Plus sérieusement, pour eviter fork dans $( ), il faut réécrire les
scripts en utilisants des variables globales au lieu de l'affichage,
car dès que tu utilises $( ), les shells fork/clone etc... certains
le font même pour un interne comme echo...

Quant aux pipes, tu peux pas éviter le fork.

fichier toto:
-%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<-
echo avec FORK CLONE
f() {
	: ${x:=0}
	((x++))
	printf %s $RANDOM
}
printf '%s\t' $(f) ; echo ${x:-undef}

a=$(f) ; printf '%s\t%s\n' $a ${x:-undef}

f ; printf '\t%s\n' ${x:-undef}

echo SANS FORK CLONE
f() {
	: ${x:=0}
	((x++))
	OUT_F=$RANDOM
}
f
printf '%s\t%s\n' $OUT_F $x

f
a=$OUT_F ; printf '%s\t%s\n' $a $x

f
printf '%s\t%s\n' $OUT_F $x
-%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<--%<-

strace -e clone zsh ./toto
avec FORK CLONE
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x401d70c8) = 19385
--- SIGCHLD (Child exited) @ 0 (0) ---
687     undef
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x401d70c8) = 19386
--- SIGCHLD (Child exited) @ 0 (0) ---
687     undef
687     1
SANS FORK CLONE
19906   2
22911   3
1501    4

Au passage, un truc marrant. C'est toujours le même nombre
aléatoire qui sort avec zsh. mais bash sort des nombres différents...
> 
> d'avance merci ... Vincent ? ;-)
Heu, Christophe, ça marche aussi ?

-- 
char*p="[)1++++++11+(QI1)9191991)9)1)(II1)919Y91)9)1)(AK+9;991+3*(9I1*IY991\
)Q1)(1I1))A91991)Q1)(+)1)1++9;)Q1+(";main(_){while(*p){for(_=*p-32>>3;_;--_
)putchar(' ');if(!(_=*p++-32&7))putchar('\n');else while(_--)printf("_/");}}



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/