2017-01-24 4 views
0

저는 inotify로 일부 작업을 시도하고 일반적으로 C를 더 잘 이해하려고합니다. 나는 초보자이다. inotify 맨 페이지를보고 있었고 inotify를 사용하는 예를 보았습니다. 버퍼를 정확히 사용하는 방법에 대해 몇 가지 질문이 있습니다. 코드는 여기에 있습니다 : 내가 가장 관심이 버퍼 로직이 어떻게 작동하는지 설명 할 수 있습니까?

http://man7.org/linux/man-pages/man7/inotify.7.html

블록은 다음과 같습니다

 char buf[4096] 
      __attribute__ ((aligned(__alignof__(struct inotify_event)))); 
     const struct inotify_event *event; 
     int i; 
     ssize_t len; 
     char *ptr; 

     /* Loop while events can be read from inotify file descriptor. */ 

     for (;;) { 

      /* Read some events. */ 

      len = read(fd, buf, sizeof buf); 
      if (len == -1 && errno != EAGAIN) { 
       perror("read"); 
       exit(EXIT_FAILURE); 
      } 

      /* If the nonblocking read() found no events to read, then 
       it returns -1 with errno set to EAGAIN. In that case, 
       we exit the loop. */ 

      if (len <= 0) 
       break; 

      /* Loop over all events in the buffer */ 

      for (ptr = buf; ptr < buf + len; 
        ptr += sizeof(struct inotify_event) + event->len) { 

       event = (const struct inotify_event *) ptr; 

는 내가 이해하려고 노력 중이 야 것은이 버퍼의 비트가 처리를 얼마나 정확하게이다. 이것은 내가 알고있는 것입니다 :

char buf은 4096으로, 약 4kbs 크기의 버퍼가 있음을 의미합니다. 전화 read(fd, buf, sizeof buf)len은 0 - 4096 사이입니다 (부분 읽기가 발생할 수 있음).

일부 비동기 검사를 수행합니다.

이제 우리는 for 루프를 시작합니다. 여기서 제가 다소 혼란 스럽습니다. ptrbuf과 같게 설정 한 다음 ptr의 크기를 buff + len과 비교합니다.

이 시점에서 ptr은 '4096'값과 동일합니까? 그리고 만약 그렇다면 우리는 말하고 있습니다. ptr : 4096 < buf : 4096 + len : [0-4096]입니다. 여기에 콜론을 사용하여 변수의 값이 무엇인지 생각하고 []는 범위를 나타냅니다.

그러면 iterator 표현식으로 inotify 이벤트의 크기를 ptr+= 늘립니다.

나는 'inotify_event'객체의 버퍼를 선언하는 상위 OOP 언어에 익숙하다. 그러나 우리는 'read'에서 'inotify_event'경계에서 물기를 제거하고 해당 비트를 이벤트 객체로 캐스팅해야하는 바이트 배열을 얻고 있기 때문에 가정합니다. 소리가 맞습니까?

또한 정확히 비교가 buf[4096] 값과 어떻게 작동하는지 잘 모르겠습니다. 우리는 배열의 현재 크기 (할당 된 인덱스)를 검사하는 개념이 없기 때문에 비교에서 사용한다고 가정하고 있습니다.이 경우 메모리 공간 '4096'의 크기를 비교하고 있습니까?

도움을 주셔서 감사합니다. 이것은 처음으로 버퍼에서 비트를 처리하는 작업입니다. 이 모든 일에 내 머리를 감쌌다. 더 이상의 독서가 도움이 될 것입니다! 나는 C 언어로 좋은 양의 책을 읽고 있는데, 리눅스 시스템 프로그래밍에서 좋은 양의 책을 읽었지만 '버퍼로 작업'이나 두 영역 사이의 회색 영역과 같은 주제를 찾지 못하는 것 같습니다.

답변

0

C에서 ptr = buf 지정을하면 buf의 첫 번째 요소 주소가 ptr으로 지정됩니다. 따라서 비교는 ptr이 버퍼의 끝을 초과했는지 여부를 확인합니다.

here으로 정의 된 struct inotify_event을 건너 뛰는 데 필요한 바이트 수와 이벤트 이름의 길이로 루프가 점프하고 있습니다.

0
ptr = buf 

당신은 포인터 ptrbuf의 첫 번째 요소의 주소 (즉 &buf[0])를 할당한다.그래서 첫 번째 요소에서 시작하는 포인터를 사용하여 buf를 루핑하기 시작합니다.

ptr < buf + len; 

ptr 포인터가 buf이 끝날 때까지 배열을 통해 "이동하는"것을 확인하고 있습니다. 이것은 포인터 연산을 사용하여 만들어집니다. 따라서 루프는 ptr 주소와 주소가 buf + len 인 버퍼가 read 함수로 반환됩니다.

ptr += sizeof(struct inotify_event) + event->len 

마지막으로 포인터는 내가 변수 이벤트 유형을 기반으로 생각하는 것이, 앞으로 이벤트 구조체 struct inotify_event 플러스 이벤트 렌의 크기의 이동합니다.