Toon posts:

[C/linux/curses] wgetch() werkt niet *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit met het volgende probleem:

Ik probeer een programma te bouwen wat de output van 'ps aux' leest en in een menuutje stopt zodat je makkelijk met de pijltjes toetsen een proces kan selecteren en kan killen. Het programma wordt aangeroepen dmv van een pipeline, dus: 'ps aux|menu' zou ons programma menu moeten opstarten, die vervolgens de output van 'ps aux' van stdin leest en verwerkt.

Tot zo ver alles prima, ik krijg netjes een lijstje van de processen die er draaien. Alleen bij het selecteren gaat het fout, het programma leest om de een of andere reden geen input van het keyboard.

Hieronder me source:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include <curses.h>

char psoutput[100][250];
int ppos=1;
WINDOW *mainwin;

int showmenu() {
        int i;

        for (i = 0; i < 30; i++)
                mvwprintw(mainwin, i, 0, "  %s", psoutput[i]);

        mvwprintw(mainwin, ppos, 0, "*");
        refresh();

        return 0;
}


int main() {
        int i=0, key;

        while (fgets(psoutput[i], 250, stdin) && i < 100)
                i++;

        mainwin = initscr();
        keypad(mainwin, TRUE);
        noecho();

        showmenu();

        while (1) {
                key = wgetch(mainwin);

                mvwprintw(mainwin, 32, 0, "%d", key);

                if (key == KEY_DOWN)
                        ppos++;
                else if (key == KEY_UP)
                        ppos--;

                showmenu();
        }

        delwin(mainwin);
        endwin();
}


Omdat ik gebruik maak van de curses lib moet je het programma zo compilen:
$ gcc menu.c -o menu -lcurses

Wie de fout ziet mag het zeggen _/-\o_

PS: Het programma is nog een beetje brak enzo, maar het is nog in full development dus daarom.

[ Voor 7% gewijzigd door Verwijderd op 05-01-2003 22:53 ]


Verwijderd

The getch(), wgetch(), mvgetch() and mvwgetch(), routines read a character from the window. In no-delay mode, if no input is waiting, the value ERR is returned. In delay mode, the program waits until the system passes text through to the program. Depending on the setting of cbreak(), this is after one character (cbreak mode), or after the first newline (nocbreak mode). In half-delay mode, the program waits until a character is typed or the specified timeout has been reached.
Ik gok dus dat je in delay mode zit (default van linux shell). Met cbreak() kun je dit veranderen.

[ Voor 8% gewijzigd door Verwijderd op 06-01-2003 07:56 ]


Verwijderd

Topicstarter
Nope, geen effect.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

was het niet -lncurses?
* D2k heeft geen linux om het ff te testen

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
Nee aan het compilen ligt het niet, ik krijg geen errors. En een ander programma (wat niet vantevoren uit de stdin leest) werkt precies hetzelfde met wgetch() en die werkt wel, wat het probleem deste vreemder maakt..

  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 16-08 07:25
Zou een fflush(stdin); voor de wgetch misschien een oplossing bieden?

  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

Verwijderd schreef op 05 januari 2003 @ 22:51:
Ik zit met het volgende probleem:

Ik probeer een programma te bouwen wat de output van 'ps aux' leest en in een menuutje stopt zodat je makkelijk met de pijltjes toetsen een proces kan selecteren en kan killen. Het programma wordt aangeroepen dmv van een pipeline, dus: 'ps aux|menu' zou ons programma menu moeten opstarten, die vervolgens de output van 'ps aux' van stdin leest en verwerkt.

Tot zo ver alles prima, ik krijg netjes een lijstje van de processen die er draaien. Alleen bij het selecteren gaat het fout, het programma leest om de een of andere reden geen input van het keyboard.
Nee, nogal wiedes omdat je stdin nu de outvoer van de pipe is.

Je moet zorgen dat je pipe niet op fd 0 hangt, en dat fd 0 gewoon weer aan je terminal zit :


code:
1
2
3
4
5
   int newfd;

  newfd = dup(0);
  close(0);
  open("/dev/tty", O_RDWR, 0);


je leest je data nu van newfd, en je kan nu ook weer vanaf keyboard lezen

  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

RdeTuinman schreef op 06 januari 2003 @ 12:38:
Zou een fflush(stdin); voor de wgetch misschien een oplossing bieden?
een fflush(stdin) is een NOOP op Linux (en de meeste overige *NIX varianten)

Verwijderd

Topicstarter
ja het werkt,

bedankt igmar _/-\o_

  • windancer
  • Registratie: Maart 2000
  • Laatst online: 18-08 22:36
Probeer eens een nonl() na je noecho()
Pagina: 1