Devices most likely get a file in `/dev/input/` named `eventN` where N is the various devices like mouse and keyboard. ls -l /dev/input/by-{path,id}/ should give you a hint. Also look at: cat /proc/bus/input/devices Where `Sysfs` value is path under `/sys`. You can test by e.g. cat /dev/input/event2 # if 2 is kbd. To implement use ioctl and check devices + monitor. ---- **EDIT:** In regards to *"Explain that last statement …"*. Going over in [stackoverflow][1] land here … but: A quick and dirty sample in C. You'll have to implement various code to check that you actually get correct device, translate event type, code and value. Typically key-donw, key-up, key-press, key-code, etc. Haven't time, (and is to much here), to add the rest. Check out `linux/input.h`, programs like `dumpkeys`, kernel code etc. for mapping codes. E.g. `dumpkeys -l` Anyhow: Run as e.g.: # ./testprog /dev/input/event2 Code: #include <stdio.h> #include <string.h> /* strerror() */ #include <errno.h> /* errno */ #include <fcntl.h> /* open() */ #include <unistd.h> /* close() */ #include <sys/ioctl.h> /* ioctl() */ #include <linux/input.h> /* EVIOCGVERSION ++ */ #define EV_BUF_SIZE 16 int main(int argc, char *argv[]) { int fd, sz; unsigned i; /* A few examples of information to gather */ unsigned version; unsigned short id[4]; char name[256] = "N/A"; struct input_event ev[EV_BUF_SIZE]; /* Read up to N events ata time */ if (argc < 2) { fprintf(stderr, "Usage: %s /dev/input/eventN\n" "Where X = input device number\n", argv[0] ); return EINVAL; } if ((fd = open(argv[1], O_RDONLY)) < 0) { fprintf(stderr, "ERR %d:\n" "Unable to open `%s'\n" "%s\n", errno, argv[1], strerror(errno) ); } /* Error check here as well. */ ioctl(fd, EVIOCGVERSION, &version); ioctl(fd, EVIOCGID, id); ioctl(fd, EVIOCGNAME(sizeof(name)), name); fprintf(stderr, "Name : %s\n" "Version : %d.%d.%d\n" "ID : bus 0x%02x vendor 0x%02x product 0x%02x version 0x%02x\n" "----------\n" , name, version >> 16, (version >> 8) & 0xff, version & 0xff, id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION] ); /* Loop. Read event file and parse result. */ for (;;) { sz = read(fd, ev, sizeof(struct input_event) * EV_BUF_SIZE); if (sz < (int) sizeof(struct input_event)) { fprintf(stderr, "ERR %d:\n" "Reading of `%s' failed\n" "%s\n", errno, argv[1], strerror(errno) ); goto fine; } /* Implement code to translate type, code and value */ for (i = 0; i < sz / sizeof(struct input_event); ++i) { fprintf(stderr, "%ld.%06ld: " "type=%d " "code=%d " "value=%d\n", ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type, ev[i].code, ev[i].value ); } } fine: close(fd); return errno; } [1]: http://stackoverflow.com/