【问题标题】:Detecting Device plugged and unplugged检测设备插入和拔出
【发布时间】:2012-11-10 01:14:13
【问题描述】:

我正在编写代码并且我使用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;

谢谢..

【问题讨论】:

    标签: c linux


    【解决方案1】:

    在拔下 USB 串行适配器后访问它不会导致我的段错误——我不久前为我的工作进行了大量测试。

    我注意到一件事,您似乎没有将“循环”初始化为与未插入设备相对应的“devlist”元素。如果您没有从 plug 和 unplug 事件之间的函数返回,并且您拔出与上次插入的设备相同的设备,那么这可能会发生。但这是我对您的段错误的赌注。

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

    一般来说,我建议在 gdb 下运行您的程序,并在它崩溃时获取堆栈跟踪。这会告诉你错误发生在哪一行。

    【讨论】:

    • 谢谢,我确实在顶部初始化了循环并且没有包含代码。将尝试返回 -1。
    • 谢谢我让它工作了。你回答的有效。伟大的。真的很感激。问题在于代码阅读。我删除了我遇到问题的部分并且 bwala 它可以工作。再次非常感谢。
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 2013-04-03
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多