ncurses & SIGWINCH

Petr Vasicek petr851 na seznam.cz
Pátek Březen 19 20:43:24 CET 2004


Dobry den,

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 mel, 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 mozne 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 zvykly z DOSu na
retezeni ve stylu preruseni asm/INT 2F a podobne. 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?

Vim, ze by slo (relativne ciste) udelat vlastni buffer
klavesnice + obsluzne rutiny a hodit blokujici cekani a vubec
celou spravu do zvlastniho threadu, vlaken uz tam mam ale az dost
a spis me palci ony tri vyse popsane problemy.

Navic bych to rad vyresil s tou readline totalne nezavislou na
tom, jak program co ji pouziva funguje...

Dekuji moc,
Petr Vasicek
____________________________________________________________
www.BaterieDoMobilu.cz - nejširší sortiment kvalitních baterií se zárukou za super ceny od 199 Kc, poštovné od 2 kusu ZDARMA.
http://ad2.seznam.cz/redir.cgi?instance=72312%26url=http://www.bateriedomobilu.cz


Další informace o konferenci Linux