Hello, I am trying to detect USB device removal using its file descriptor within the /dev/bus/usb/999/999 filesystem. I believe this is why the USBDEVFS_DISCSIGNAL ioctl is available. But it looks like the poll never wakes up and the signal is never called. I noticed some people who succeeded in making this work, but I cannot figure out what is wrong. I am using linux-2.6.28. Can anyone help? Maybe there is a different way to achieve this task. Thank you, Alon. --- #include <sys/ioctl.h> #include <sys/poll.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <unistd.h> #include <fcntl.h> #include <linux/usbdevice_fs.h> #define USB_DISCONNECT_SIGNAL (SIGRTMIN) static void disconnect_action( int sig_num, siginfo_t *sinfo, void *pinfo) { (void)sig_num;(void)sinfo;(void)pinfo; printf("SIGNAL!\n"); } int main(int argc, char *argv[]) { struct sigaction act; struct usbdevfs_disconnectsignal ds; struct pollfd pfd; char *device; int fd; if (argc != 2) { printf("Usage: device\n"); exit(1); } device = argv[1]; if ((fd = open(device, O_RDWR)) == -1) { perror("open"); exit(1); } if (sigaction(USB_DISCONNECT_SIGNAL, NULL, &act) == -1) { perror("sigaction"); exit(1); } act.sa_sigaction = disconnect_action; act.sa_flags = SA_SIGINFO; if (sigaction(USB_DISCONNECT_SIGNAL, &act, NULL) == -1) { perror("sigaction"); exit(1); } memset(&ds, 0, sizeof(ds)); ds.signr = USB_DISCONNECT_SIGNAL; if (ioctl(fd, USBDEVFS_DISCSIGNAL, &ds) == -1) { perror("ioctl"); exit(1); } pfd.fd = fd; pfd.events = POLLIN | POLLOUT; printf("Before poll\n"); if (poll(&pfd, 1, -1) == -1) { perror("poll"); exit(1); } printf("After poll\n"); close(fd); return 0; } -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html