OVH Cloud OVH Cloud

valeur de la variable $$ ?

4 réponses
Avatar
chatiman
Bonjour,

la variable $$ ne semble pas marcher dans
les processus fils de meme pour $PPID :

(
echo fils: $$
) &
echo pere: $$

m'affiche:
fils: 6656
pere: 6656

pourtant il y a bien 2 processus shell
d'après ps

Est-ce normal ?

4 réponses

Avatar
Stephane Chazelas
2004-11-10, 10:13(+01), chatiman:
la variable $$ ne semble pas marcher dans
les processus fils de meme pour $PPID :

(
echo fils: $$
) &
echo pere: $$

m'affiche:
fils: 6656
pere: 6656

pourtant il y a bien 2 processus shell
d'après ps

Est-ce normal ?


Oui, c'est comme ca et heureusement. Il y a des cas ou il est
difficile de savoir ce qui est lancé dans un sous-shell ou pas
et ca depend meme des shells.

$$ est le PID du shell qui a lancé le script par definition. Les
forks successifs, c'est la soupe interne du shell.

Si on allait par la,

echo "$$"

donnerait le pid du shell (parce que echo est builtin)

et

/bin/echo "$$"

donnerait le pid du sous-shell qui va executer echo, pas facile
de s'en sortir.

Tu voulais peut-etre:

(
...
) &
pere=$$
fils=$!

--
Stephane

Avatar
chatiman
Tu voulais peut-etre:

(
...
) &
pere=$$
fils=$!



oui mais j'ai un script un peu complexe du type
(
# fils1
trap "exit 1" USR1
(
#fils2
sleep ...
kill -USR1 fils1
) &

) &

et je voudrais que fils2 puisse connaitre le pid de fils1 (impossible
avec $!) afin de le tuer (envoyer un SIGUSR1 en fait) au bout d'un
certain temps c'est la seule maniere que j'ai trouvé pour réaliser un
timeout.

Avatar
Stephane Chazelas
2004-11-10, 10:52(+01), chatiman:
[...]
(
# fils1
trap "exit 1" USR1
(
#fils2
sleep ...
kill -USR1 fils1
) &

) &

et je voudrais que fils2 puisse connaitre le pid de fils1 (impossible
avec $!) afin de le tuer (envoyer un SIGUSR1 en fait) au bout d'un
certain temps c'est la seule maniere que j'ai trouvé pour réaliser un
timeout.
[...]


Tu peux envoyer un USR1 au process group et faire en sorte que
seul fils1 ne l'ignore pas:

trap '' USR1
(
# fils1
trap 'exit 1' USR1
(
# fils2
trap '' USR1
sleep ...
kill -USR1 "-$$"
) &
) &

--
Stephane

Avatar
chatiman

Tu peux envoyer un USR1 au process group et faire en sorte que
seul fils1 ne l'ignore pas:

trap '' USR1
(
# fils1
trap 'exit 1' USR1
(
# fils2
trap '' USR1
sleep ...
kill -USR1 "-$$"
) &
) &



Impec, merci ca devrait marcher,
j'avais pas pensé à ca