Hmm ... wild guess ... in drivers/input/evdev.c I found with evdev_flush() if (!evdev->exist || client->revoked) retval = -ENODEV; else retval = input_flush_device(&evdev->handle, file); ... could it be that close() does trigger flushing the device and the client has no permission anymore for doing that?(!) Normally close(2) does not trigger a flush but I've no idea how this is handled for this kind of devices? Maybe the is a pending I/O handler triggered to late.