Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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...
-
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.
-
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.