我正在编写代码并使用 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;
谢谢..
最佳答案
在 USB 串口适配器被拔掉后访问它不会对我造成段错误——我不久前对我的工作进行了相当多的测试。
我注意到一件事,您似乎没有将“循环”初始化为对应于未插入设备的“devlist”元素。如果您没有从插入和拔出事件之间的函数返回并且拔出与上次插入相同的设备,那么这可能会起作用。但我敢打赌您会在哪里出现段错误。
我怀疑的另一个候选者是您用于读取或写入设备的代码。拔下设备后,读取和写入系统调用将返回 -1,如果您没有检查该错误或您的错误处理代码有错误,那也可能是您的问题。
一般来说,我建议在 gdb 下运行您的程序,并在程序崩溃时获取堆栈跟踪。这将告诉您错误发生在哪个行号。
关于c - 检测设备插入和拔出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13312420/