2017-01-24 52 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循環,這裏是我有點困惑。我們設置ptr等於buf,然後比較ptr的大小與buff + len

此時ptr的值是否等於'4096'?如果是這樣,我們說;是ptr:4096 < buf:4096 + len:[0-4096]。我在這裏使用冒號來表示我認爲變量的值是什麼,[]表示一個範圍。

然後我們作爲迭代器表達式,增加一個inotify事件的大小ptr+=

我習慣於更高級別的OOP語言,其中我聲明瞭一個'inotify_event'對象的緩衝區。不過,我假設,因爲我們只是從'讀取'返回一個字節數組,我們需要在'inotify_event'邊界處剔除咬住的數據,並將這些數據類型轉換爲事件對象。這聽起來正確嗎?

另外,我並不完全確定如何與buf[4096]值進行比較。我們沒有檢查數組當前大小的概念(已分配索引),所以我假定在比較使用時,我們正在比較分配的內存空間大小'4096'在這種情況下?

感謝您的幫助,這是我第一次真正處理關閉緩衝區的位。試圖把我的頭圍繞着這一切。任何進一步的閱讀將是有益的!我一直在尋找C語言作爲一種很好的閱讀方式,在linux系統編程上閱讀了大量的內容,但我似乎無法找到諸如'使用緩衝區'或兩者之間的灰色區域等主題。

回答

0

當您在C中執行作業ptr = buf時,您將第一個元素buf的地址分配給ptr。因此,比較是檢查ptr是否超出了緩衝區的末端。

循環跳過跳過一個struct inotify_event所需的字節數,該字節被定義爲here,並且該事件的名稱長度。

0
ptr = buf 

要分配的buf第一元件的地址(即&buf[0])到指針ptr。因此,您正在使用從第一個元素開始的指針開始循環buf。

ptr < buf + len; 

這是檢查你的ptr指針「移動」通過陣列直到buf結束。它是使用指針算術製作的。因此,循環比較ptr指向地址的地址與buf + 函數返回的緩衝區的地址len

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

最後的指針向前移動時結構struct inotify_event加上事件LEN的大小,我猜是基於事件類型的變量。

相關問題