Messages in this thread | | | Subject | 2.5.61/usb: poll does not time out | From | Andreas Jellinghaus <> | Date | 15 Feb 2003 20:55:01 +0100 |
| |
Hi,
poll() should return as soon as there is some event. unplugging a usb device will cause poll to set revents to POLLERR|POLLHUP.
But the poll() syscall is not returned, instead the kernel waits for the timeout to count down / in the case poll with a negative value to wait forever. This way an application will never notice that the usb device has been removed.
here is a strace on a test app. the kernel waits full 10 seconds (the timeout used), even though the usb device was removed in the first five seconds.
send(4, "<15>Feb 15 20:47:52 usbtoken[947"..., 52, 0) = 52 rt_sigaction(SIGPIPE, {SIG_DFL}, NULL, 8) = 0 poll([{fd=3, events=POLLIN|POLLPRI|POLLOUT|POLLERR, revents=POLLERR|POLLHUP}], 1, 10000) = 1 time([1045338482]) = 1045338482 getpid() = 9477 writev(2, [{"usbtoken[9477]: device removed. "..., 41}], 1usbtoken[9477]: device removed. exiting. ) = 41 rt_sigaction(SIGPIPE, {0x400edf48, [], 0x4000000}, {SIG_DFL}, 8) = 0 send(4, "<15>Feb 15 20:48:02 usbtoken[947"..., 61, 0) = 61
was it meant to be that way?
if so: how can i work around this (in a nice way) ?
i could: a) use short timeouts and a permanent loop (not nice) b) use the hotplug script when it is called with "remove" to find the app with which has the device still open and kill the process / send some signal. also not nice.
Andreas
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |