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/