De ce SIGUSR1 determină terminarea procesului? (Unix, Semnale)

Alois Mahdal a intrebat.

Am fost surprins de acest comentariu în altă întrebare:

Dacă trimiteți dd semnalul USR1 prea curând după ce a pornit (adică într-un script bash, la linia de după ce l-ați pornit), dd va fi de fapt terminat.

Poate cineva să explice de ce?

Comentarii

  • Nu este atât de mult un răspuns la întrebarea dvs., dar încercați acest one-liner: { dd if=/dev/zero of=/dev/null & }; kill -USR1 $!; jobs; sleep 1; jobs pentru a reproduce efectul pe care îl descrieți. –  > Por jippie.
1 răspunsuri
Michael Mrozek

Fiecare semnal are o „dispoziție implicită” – ceea ce face în mod implicit un proces atunci când primește acel semnal. Există un tabel în fișierul signal(7) pagina de manual care le listează:

Signal     Value     Action   Comment
──────────────────────────────────────────────────────────────────────
...
SIGUSR1   30,10,16    Term    User-defined signal 1
SIGUSR2   31,12,17    Term    User-defined signal 2

SIGUSR1 și SIGUSR2 ambele au acțiunea implicită Term — procesul este încheiat. dd înregistrează un gestionar pentru a intercepta semnalul și a face ceva util cu el, dar dacă semnalul este transmis prea repede, nu a avut timp să înregistreze acel gestionar, așa că în locul acestuia se întâmplă acțiunea implicită.

Comentarii

  • Mi-aș dori să pot să dau de două ori upvote pentru că am fost pus la curent cu această obscuritate. Să văd procese murind la întâmplare după ce am eliminat un gestionar de semnal explicit a fost deconcertant. –  > Por DeaconDesperado.
  • Există vreo modalitate practică de a controla această condiție de cursă în loc de a dormi doar pentru o perioadă de timp rezonabilă (~0,5-1 sec)? (Adică, în afară de ceva ridicol, cum ar fi capturarea și analizarea strace ieșirea într-un script shell…) – –  > Por Adrian Günter.
  • Aveam un script shell care funcționa bine. Dar dintr-o dată nu mai funcționează din cauza probabil! Aveam hyperthreding pornit acum oprit. Subprocesul care trimite kill -s SIGUSR1 $PARENT_PID devine prea rapid acum?. Marele părinte crede că părintele se termină în mod normal, dar părintele încă execută bucla. Aceasta este o postare bună. Mi-am petrecut cea mai mare parte a zilei încercând să înțeleg acest lucru. –  > Por Kemin Zhou.

Tags: