我想用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系統編程上閱讀了大量的內容,但我似乎無法找到諸如'使用緩衝區'或兩者之間的灰色區域等主題。