Signaux et parallélisme

Signaux et parallélisme - Shell/Batch - Programmation

Marsh Posté le 04-02-2013 à 16:30:00    

Bonjour à tous,
 
Je suis nouvelle sur ce forum et tiens tout d'abord à vous prévenir : je suis novice en programmation et n'ai pas la lumière à tous les étages, dans cette discipline... :(  
 
Aussi, j'apprécierais grandement un peu d'aide sur un exercice...
 
La consigne :
 
Je dois complétez les scripts suivants pour que :
- la réception du premier signal SIGUSR1 par le processus sigPere.sh provoque la fin de sig1.sh
- la réception du premier signal SIGUSR2 par sigPere.sh provoque la fin de sig2.sh
- après avoir reçu un signal SIGUSR1 (SIGUSR2), sigPere.sh ignore les autres.
 

Code :
  1. #! /bin/bash
  2. # sigPere.sh
  3. echo pere debut : $$
  4. ./sig1.sh &
  5. ./sig2.sh &
  6. while true; do
  7.    sleep 1
  8. done
  9. #! /bin/bash
  10. # sig1.sh
  11. echo sig1 debut
  12. while true; do
  13.    sleep 1
  14. done
  15. #! /bin/bash
  16. # sig2.sh
  17. echo sig2 debut
  18. while true; do
  19.    sleep 1
  20. done


 
J'ai récupéré le PID des deux processus fils pour que sigPere puisse leur envoyer un SIGKILL. Ce qui donnerait :

Code :
  1. ./sig1.sh &
  2. SIG1PID=$!
  3. ./sig2.sh &
  4. SIG2PID=$!
  5. trap "kill -SIGKILL $SIG1PID" SIGUSR1
  6. trap "kill -SIGKILL $SIG2PID" SIGUSR2


 
Après quoi, sigPere ignorerait les signaux suivants :

Code :
  1. trap "" SIGUSR1
  2.    trap "" SIGUSR2


 
Mais je bloque sur l'enchaînement du script. Devrais-je incrémenter un compteur ?
 
Merci de m'avoir lue... :)

Reply

Marsh Posté le 04-02-2013 à 16:30:00   

Reply

Marsh Posté le 04-02-2013 à 17:03:03    

Je pense qu'il faut
- garder effectivement les PID de sig1 et de sig2
- positionner un flag indiquant si l'on a reçu le signal SIGUSR1 (et un autre pour SIGUSR2)
 
A réception SIGUSR1 :
- si on a déjà reçu (flag modifié), ne rien faire
- sinon, positionner le flag et envoyer SIGKILL au process sig1
(et idem pour SIGUSR2)
 
(mais c'est jamais simple ce type de sujet :pt1cable: )


---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 04-02-2013 à 17:56:39    

Merci beaucoup pour cette réponse ! :)  
 
Voilà ce que j'ai fait (mais sans grande conviction).
Qu'en pensez-vous ?
 

Code :
  1. #! /bin/bash
  2. # sigPere.sh
  3. echo pere debut : $$
  4. ./sig1.sh &
  5. SIG1PID=$!
  6. ./sig2.sh &
  7. SIG2PID=$!
  8. $i=0
  9. $j=0
  10. if [ $i -eq 0 ]
  11. then
  12.    trap "kill -SIGKILL $SIG1PID" SIGUSR1
  13.    i=`expr $i + 1`
  14. elif [ $j -eq 0 ]
  15. then
  16.    trap "kill -SIGKILL $SIG2PID" SIGUSR2
  17.    j=`expr $j + 1`
  18. else
  19.    trap "" SIGUSR1
  20.    trap "" SIGUSR2
  21. fi
  22. while true; do
  23.    sleep 1
  24. done

Reply

Marsh Posté le 04-02-2013 à 18:33:08    

"trap", c'est pour installer la réponse à la récpetion d'un signal ?
 
 
 
Ca ne va pas, le test doit être fait quand on reçoit le signal, pas dès le début de l'exécution du script.
 
Je verrais plus quelque chose comme :

Code :
  1. #! /bin/bash
  2. # sigPere.sh
  3. echo pere debut : $$
  4. ./sig1.sh &
  5. SIG1PID=$!
  6. ./sig2.sh &
  7. SIG2PID=$!
  8. $i=0
  9. $j=0
  10. trap "[ $i -eq 0 ] && { i=1; kill -SIGKILL $SIG1PID; }" SIGUSR1
  11. trap "[ $j -eq 0 ] && { j=1; kill -SIGKILL $SIG2PID; }" SIGUSR2
  12. while true; do
  13.   sleep 1
  14. done


Message édité par mrbebert le 04-02-2013 à 18:34:13

---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 05-02-2013 à 06:12:33    

Merci pour cette nouvelle réponse ! :wahoo:  
 
Le raisonnement me paraît logique et bien plus simple, mais j'ignorais que l'on pouvait inclure une condition dans "trap". Est-ce vraiment possible ?
 
Je continue de réfléchir.

Reply

Marsh Posté le 05-02-2013 à 13:32:39    

Je ne sais pas, j'ai pas d'Unix sous la main pour tester. A priori, on lui défini la commande à exécuter et une commande peut tout à fait inclure une condition. Sinon, essayer en mettant celà dans une fonction et en ne faisant que l'appel de la fonction dans le trap.
Faut tester.


---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 05-02-2013 à 19:54:52    

Alors... Je n'ai pas réussi à me dépatouiller des messages d'erreur lorsque j'essayais d'inclure la condition dans le trap, mais j'ai pu produire un programme qui fonctionne. :) Le voici :

Code :
  1. #! /bin/bash
  2. # sigPere.sh
  3. echo pere debut : $$
  4. ./bin/sig1.sh &
  5. SIG1PID=$!
  6. ./bin/sig2.sh &
  7. SIG2PID=$!
  8. ./bin/signal.sh &
  9. i=0
  10. j=0
  11. while true; do
  12.    if [ $i -eq 0 ]
  13.    then
  14.       trap "kill -SIGKILL $SIG1PID; echo fin sig1" SIGUSR1
  15.       i=`expr $i + 1`
  16.    elif [ $j -eq 0 ]
  17.    then
  18.       trap "kill -SIGKILL $SIG2PID; echo fin sig2" SIGUSR2
  19.       j=`expr $j + 1`
  20.    else
  21.       trap "" SIGUSR1
  22.       trap "" SIGUSR2
  23.    fi
  24.    sleep 1
  25. done


 
signal.sh me sert juste à envoyer des SIGUSR1 (les SIGUSR2, ça ne marche pas, mais bon...)
Voilà... Merci pour votre aide !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed