Mam nasledujici problem, pokud nekdo poradi, budu vazne vdecny!!!
Pisu si rutinu ve stylu readline, ale pod ncurses (nonl, cbreak, noecho, keypad) - rad bych si odchytaval signal pri zmene velikosti terminalu a prekreslil obrazovku (az sem v pohode). Problem je, ze se mi smycka blokuje na getch(), ktery mi nevrati KEY_RESIZE okamzite, jak by mela, ale ceka az na stisk dalsi klavesy a pak vyvrhne oboji najednou.
Tohle chovani je zpusobeno tim, ze mam vlastni obsluhu signalu SIGWINCH, to vim. Kdyz ji vyradim, tak getch() pekne KEY_RESIZE vrati hned a neblokuje, ale tim zas prichazim o moznost asynchrone a nezavisle na ty moji "readline" updatovat terminal.
Jina moznost by byla pouzit nodelay() a getch() by pak neblokovala nikdy, ale tam zas mam problem ze smycka typu:
while (1) {
if ((c = getch()) == ERR)
break;
...
}
sezere 99% CPU. :(
Tedy otazky co me trapi a rad bych znal odpoved:
1) Je mozny z moji obsluhy signalu nejak zavolat tu puvodni, aby vsechno udelala jak ma (tzn, nejak interne uvedomila getch(), ze ma skoncit s KEY_RESIZE)? Zkousel jsem to pres:
typedef void (*sighandler_t)(int);
sighandler_t oldsig;
my_resize_event(int sig) {
...
oldsig(sig);
signal(SIGWINCH, &resize_event);
return;
}
main() {
...
initscr, atd...
oldsig = signal(SIGWINCH, &my_resize_event);
...
}
ale to neudela nic (jako bych ji zevnitr obsluhy vubec nevolal).
2) Jak vubec retezeni signalu funguje, jsem zvyklej z DOSu na retezeni ve stylu preruseni asm/INT 2F a tak. Jde to nejak podobne v Linuxu na vyssi urovni (C) se signaly?
3) Jak udelat - obecne - smycku typu co jsem popisoval a pri tom pouzit jen nezbytne nutne _minimum_ casu CPU?
Uz jsem se ptal na linux@linux.cz, ale nikdo mi zatim nebyl schopen/ochoten odpovedet... :(
Diky za radu/odkaz!