2012-11-09 75 views
0

我正在写一个代码和即时通讯使用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); 
} 

一旦我得到deviced开我可以阅读到它的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

访问USB串行适配器,它已经拔出后不会导致段错误,我 - 我测试了这个漂亮的巨资对我的工作而回。

我注意到一件事情,你似乎没有初始化“回路”到“devlist”元素对应于拔下的设备。如果您没有从插拔事件之间的功能返回,并且您拔出上次插入的同一设备,则可能会发生这种情况。但是,这是我打赌你在哪里进行分段转换。

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

一般来说,我建议在gdb下运行你的程序并在崩溃时得到堆栈跟踪。这将告诉你错误发生在哪一行上。

+0

谢谢,我没有初始化顶部的循环,并没有包含代码。要尝试返回-1。 – demic0de

+0

谢谢,我得到它的工作。你回答的是什么作品。大。真的很感激它。问题在于代码阅读。我删除了我遇到麻烦和bwala工作的部分。再次感谢很多。 – demic0de

+0

我很高兴有帮助! –