2012-11-09 3 views
0

libudev.h를 사용하여 코드 및 메신저를 작성하고 있습니다. 지금까지 장치를 감지하여 열 수 있고 열린 장치의 fd를 devlist에 넣어 데이터를 읽고 쓸 수 있습니까? 내 문제는 내가 장치를 뽑으면 나는 세분화 오류가 발생합니다. 내가 개방 deviced을 받으면장치 감지 및 연결 해제

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

나를 위해 세그먼트 폴트가 발생하지 않습니다 분리되었습니다 후 USB 직렬 어댑터 액세스 - 내가 잠시 다시 내 일을 꽤 많이이 테스트를.

나는 언 마운트 된 장치에 해당하는 "devlist"의 요소에 "루프"를 초기화하지 않은 것 같습니다. 플러그와 플러그를 뽑는 사이의 기능에서 돌아 오지 않고 마지막으로 연결 한 것과 동일한 장치를 분리하면 작동하지 않을 수 있습니다.하지만 그 부분은 당신이 segfaulting하는 것에 대한 내 내기입니다.

다른 후보자는 장치를 읽거나 쓰는 코드입니다. 읽기 및 쓰기 syscall은 장치가 분리 된 후에 -1을 반환하며, 해당 오류를 확인하지 않거나 오류 처리 코드에 버그가있는 경우 문제가 될 수도 있습니다.

일반적으로 gdb에서 프로그램을 실행하고 충돌이 발생하면 스택 추적을받는 것이 좋습니다. 그러면 오류가 발생한 행 번호가 표시됩니다.

+0

감사합니다. 상단의 루프를 초기화했지만 코드를 포함하지 않았습니다. 돌아올거야 -1. – demic0de

+0

감사합니다. 당신이 대답 한 것은 효과가 있습니다. 큰. 정말 감사합니다. 문제는 코드를 읽는 것입니다. 나는 문제가있는 부분을 제거하고 그것이 효과가 있다고 믿는다. 다시 한번 고마워. – demic0de

+0

도와 주셔서 기쁩니다! –