检测设备已插入和拔出

时间:2012-11-09 16:52:07

标签: c linux

我正在编写一个代码,我正在使用libudev.h到目前为止,我可以检测设备并打开它们,并将已打开设备的fd放入devlist中以读取和写入数据。我的问题是,当我拔掉设备时,我会收到分段错误。

if (FD_ISSET(fd, &fds))
{
    dev = udev_monitor_receive_device(mon);
    if (dev)
    {
        if(strcmp(udev_device_get_action(dev),"add")==0)
        {
            if(strcmp(udev_device_get_devnode(dev), "/dev/ttyUSB0")==0)
            {
                fd1 = open(udev_device_get_devnode(dev), O_RDWR | O_NONBLOCK);
                if(fd1<0)
                {
                    printf("Can't open Device\n");
                    exit(0);
                }
            }
            printf("Device plugged\n");
            printf("   Node: %s\n", udev_device_get_devnode(dev));
            printf("   Action: %s\n", udev_device_get_action(dev));
            printf("device opened\n");

            int opt =1;

            ioctl(fd1, FIONBIO,(char *) &opt);
            for(loop=0; loop<MAXDEV; loop++)
                if(devlist[loop] == 0)
                {
                    devlist[loop] = fd1;
                    fd1 = -1;
                }
        }
        else {
            printf("Device unplugged\n");
            printf("   Node: %s\n", udev_device_get_devnode(dev));
            printf("   Action: %s\n", udev_device_get_action(dev));
            FD_CLR(devlist[loop],&fds);
            close(devlist[loop]);
            devlist[loop] = -1;
        }
        udev_device_unref(dev);
}

一旦我打开装置,我就可以阅读它的fd并且它没有问题但是当我拔掉设备时我会收到错误。

这是我遇到麻烦的部分。

printf("Device unplugged\n");
printf("   Node: %s\n", udev_device_get_devnode(dev));
printf("   Action: %s\n", udev_device_get_action(dev));
FD_CLR(devlist[loop],&fds);
close(devlist[loop]);
devlist[loop] = -1;

谢谢..

1 个答案:

答案 0 :(得分:1)

拔下插头后拔掉USB串口适配器对我来说不会造成段错误 - 我对我的工作进行了大量的测试。

我注意到你似乎没有初始化&#34;循环&#34;到'#34; devlist&#34;的元素对应于未插入的设备。如果您没有从插件和拔出事件之间的功能返回并且拔掉上次插入的同一设备,那么这可能会起作用。但这是我打赌你在哪里进行分类的

我怀疑的另一位候选人是您阅读或编写设备的代码。在拔下设备后,读写系统调用将返回-1,如果您没有检查该错误,或​​者您的错误处理代码有错误,那也可能是您的问题。

一般情况下,我建议您在gdb下运行程序并在崩溃时获取堆栈跟踪。这将告诉您错误发生在哪个行号。