저는 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]입니다. 여기에 콜론을 사용하여 변수의 값이 무엇인지 생각하고 []는 범위를 나타냅니다.
그러면 iterator 표현식으로 inotify 이벤트의 크기를 ptr+=
늘립니다.
나는 'inotify_event'객체의 버퍼를 선언하는 상위 OOP 언어에 익숙하다. 그러나 우리는 'read'에서 'inotify_event'경계에서 물기를 제거하고 해당 비트를 이벤트 객체로 캐스팅해야하는 바이트 배열을 얻고 있기 때문에 가정합니다. 소리가 맞습니까?
또한 정확히 비교가 buf[4096]
값과 어떻게 작동하는지 잘 모르겠습니다. 우리는 배열의 현재 크기 (할당 된 인덱스)를 검사하는 개념이 없기 때문에 비교에서 사용한다고 가정하고 있습니다.이 경우 메모리 공간 '4096'의 크기를 비교하고 있습니까?
도움을 주셔서 감사합니다. 이것은 처음으로 버퍼에서 비트를 처리하는 작업입니다. 이 모든 일에 내 머리를 감쌌다. 더 이상의 독서가 도움이 될 것입니다! 나는 C 언어로 좋은 양의 책을 읽고 있는데, 리눅스 시스템 프로그래밍에서 좋은 양의 책을 읽었지만 '버퍼로 작업'이나 두 영역 사이의 회색 영역과 같은 주제를 찾지 못하는 것 같습니다.