Názor k článku Programování pod Linuxem pro všechny (9) od pet - Mam nasledujici problem, pokud nekdo poradi, budu vazne...

  • Článek je starý, nové názory již nelze přidávat.
  • 21. 3. 2004 21:04

    pet (neregistrovaný)

    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!