Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: hm 12. 09. 2013, 13:34:55

Název: Ctrl+C ne vždycky zabije proces
Přispěvatel: hm 12. 09. 2013, 13:34:55
Mam konzolovou aplikaci v MONO.
Jako SSH klienta pouzivam PuTTY 0.63 na serveru mam nainstalovany Debian a openSSH

Uz se mi nekolikrat stalo, ze po zmacknuti CTRL+C se aplikace nezabila, ale zustala viset v procesech (mono), ale uz nic nedelala.
Nevite cim to muze byt? Celkem me tohle chovani znepokojuje.

Nevim totiz, jestli mi to takhle obcas blbne jen pri odeslani CTRL+C a nebo se muze i stat, ze uplne stejne selze i pozadani samotneho programu na zabiti sebe sama...
Název: Re:ctrl+c ne vzdycky zabije proces
Přispěvatel: gamer 12. 09. 2013, 13:50:39
http://en.wikipedia.org/wiki/Control-C
It is a special sequence which causes the operating system to send a signal to the active program. Usually the signal causes it to end, but the program may "catch" it and do something else, typically returning control to the user.
Název: Re:ctrl+c ne vzdycky zabije proces
Přispěvatel: tonda_ 12. 09. 2013, 13:54:12
Singaly na linux

http://man7.org/linux/man-pages/man7/signal.7.html


crtl+c je SIGINT and ten muze byt odchycen a applice se muze rozhodnout co s tim...
Název: Re:Ctrl+C ne vždycky zabije proces
Přispěvatel: Ivan 12. 09. 2013, 15:20:16
Zrovna mono dela se signalama divoky veci. Vcetne toho, ze si samo some posila signaly SIGUSR*.
Myslim, ze se tim snazi emulovat nejakou wokenni funkcionalitu.

Pokud aplikace sama tomu pozadavku odmita vyhovet, tak ti nezbude nic jinyho nez ji zabit.
Název: Re:Ctrl+C ne vždycky zabije proces
Přispěvatel: libcha 12. 09. 2013, 18:28:41
Ovšem zde nastává otázka, jak program univerzálně zabít ?

Osobně mu umím poslat KILL (zabij se), ale i to často neposlechne - visí na nějakém I/O, byť třeba vysokoúrovňově síťovém, a ukáže ti prostředníček.
Název: Re:Ctrl+C ne vždycky zabije proces
Přispěvatel: Ramtech 12. 09. 2013, 18:51:12
Použi SIGKILL
Název: Re:Ctrl+C ne vždycky zabije proces
Přispěvatel: xxx xxx 12. 09. 2013, 20:00:41
TROLL Say: Řešení je nepoužívat MONO ale v dnešní době STEREO (C++) či python/javu nebo prostě něco co funguje ... 
Název: Re:Ctrl+C ne vždycky zabije proces
Přispěvatel: vbl 12. 09. 2013, 20:28:25
A co zkusit SIGQUIT, ktery je standardne namapovany na Ctrl-\ (control backspace)?
Název: Re:Ctrl+C ne vždycky zabije proces
Přispěvatel: Ivan 13. 09. 2013, 10:54:52
Otevri si zdrojaky a pripoj k tomu debuger. Pak uvidis presne co se v te aplikaci deje.
Název: Re:Ctrl+C ne vždycky zabije proces
Přispěvatel: vbl 13. 09. 2013, 12:50:51
A co zkusit SIGQUIT, ktery je standardne namapovany na Ctrl-\ (control backspace)?
Uf, samozrejme backslash...
Název: Re:Ctrl+C ne vždycky zabije proces
Přispěvatel: hm 13. 09. 2013, 14:00:58
aha, ja si vzdy mylne myslel, ze ctrl+c je SIGKILL a to by mel byt ekvivalent prikazu `kill -9`?? Takze jsem ho pouzival spatne.
Jinak moje aplikace zadne signaly neodchytava. (Proto se to chova tak nahodne v pripade SIGINT ?)

Jediny na cem mi vlastne zalezi -  na konci behu aplikace ji nasilne vypinam (v ty dobe uz jsou vsechny zdroje s kterymi pracuji uvolneny)

 Process.GetCurrentProcess().Kill() -- tohle doufam je na linuxu SIGKILL, ale nemuzu to nikde dohledat... Pokud je to SIGKILL, tak ten snad ani odchytnout aplikaci nejde a tedy by se mel vzdy vykonat. Tim padem je vse v poradku.

Jinak duvod, proc takhle momentalne ukoncuji proces -  komentar nekoho jineho u jine mono aplikace
Kód: [Vybrat]
              // This is really ugly. However, mono doesn't exit even if all our threads are
                // terminated. libspotify internal threads are are still active and prevents mono
                // from exiting. Should be done with some other signal than SIGKILL.