2012-11-09 77 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

我很高興有幫助! –