Mihai Maties wrote:
> In felul asta, la fiecare trimitere de SIGUSR1 catre script se va afisa un
> numar. Partea proasta e ca datorita "while-ului" din final procesorul se duce
> spre Nirvana. Daca inlocuim "linia buclucasa" din 'while' cu un sleep X
> atunci avem sanse sa pierdem tratarea unor semnale (i.e. daca punem "sleep 1"
> si trimitem 3 semnale pe secunda, numai unul va fi tratat).
>
Semnalele posix pe post de counter sunt inerent nesigure: nimeni nu-ti
garanteaza ca nu o sa primesti mai multe semnale inainte ca procesul sa
primeasca CPU sau ca nu or sa mai aterizeze cateva cand esti in signal
handler chiar si cu busy-loop-ul ala oribil. Pentru livrare garantata
forget posix signals & bash, use real time signals.
> Daca am inteles corect problema se pune astfel: cum rescriem scriptul de mai
> sus astfel incat sa nu se piarda semnale, dar nici sa nu omoare procesorul ?
> Probabil ca o solutie ar fi folosirea unui job aditional + wait.
>
In loop-ul ala e nevoie de o operatie blocanta si interuptibila, care sa
puna procesul in sleep dar care sa returneze imediat cand primeste un
semnal. Din pacate bash nu are un echivalent pause(2) asa ca trebuie
improvizat. Solutia lui Victor (read) does the job atata timp cat
procesul e in foreground si are acces la tty. Alta solutie (background
safe, cu output redirectat) ar fi deschiderea unui FIFO fara writer
pentru citire:
#! /bin/bash
FIFO=/tmp/fifo
OUT=/tmp/out
t=1
sig_usr1()
{
echo $t >> $OUT
t=$((t+1))
trap sig_usr1 SIGUSR1
}
trap sig_usr1 SIGUSR1
mkfifo $FIFO &>/dev/null
rm -f $OUT &>/dev/null
trap "rm -f $FIFO" EXIT
while true; do 3< $FIFO; done 2>/dev/null
---
fm
_______________________________________________
RLUG mailing list
[email protected]
http://lists.lug.ro/mailman/listinfo/rlug