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...
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.
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...
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.
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.
Použi SIGKILL
TROLL Say: Řešení je nepoužívat MONO ale v dnešní době STEREO (C++) či python/javu nebo prostě něco co funguje ...
A co zkusit SIGQUIT, ktery je standardne namapovany na Ctrl-\ (control backspace)?
Otevri si zdrojaky a pripoj k tomu debuger. Pak uvidis presne co se v te aplikaci deje.
Citace od: vbl kdy 12. 09. 2013, 20:28:25
A co zkusit SIGQUIT, ktery je standardne namapovany na Ctrl-\ (control backspace)?
Uf, samozrejme backslash...
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
// 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.