해결된 질문
작성
·
89
0
제가 아래의 코드로 생성 혹은 삭제된 파일의 이름에 대한 길이를 출력해보도록 했습니다. 그런데, 파일 이름이 달라도 해당 값(event->len
)이 동일하게 나오는데, 제가 코드를 잘못 짠 건가요?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/inotify.h>
int main()
{
int fd;
int wd1, wd2;
char buf[1024];
struct inotify_event *event;
// Create inotify object
fd = inotify_init();
// Add watch
wd1 = inotify_add_watch(fd, ".", IN_CREATE | IN_DELETE);
wd2 = inotify_add_watch(fd, "..", IN_CREATE | IN_DELETE);
while(1)
{
printf("I'm waiting for something to happen...\n");
int ret = read(fd, buf, sizeof(buf));
event = (struct inotify_event *)&buf[0];
while (ret > 0)
{
if (event->mask & IN_CREATE)
{
printf("File[%s](len: %d) is created!\n", event->name, event->len);
}
else if (event->mask & IN_DELETE)
{
printf("File[%s](len: %d) is deleted!\n", event->name, event->len);
}
int realSize = sizeof(struct inotify_event) + event->len;
ret -= realSize;
event = (struct inotify_event )((char )event + realSize);
}
}
// close
close(wd1);
close(wd2);
close(fd);
return 0;
}
답변 2
1
안녕하세요 iykyk0325님.
event->len이 파일명의 길이와 정확히 일치하지 않는 것은 event 구조체의 크기를 메모리에 align하도록 name 에 패딩을 추가하기 때문입니다.
struct inotify_event는 다음과 같습니다.
struct inotify_event {
int wd; // 4B
uint32_t mask; // 4B
uint32_t cookie; // 4B
uint32_t len; // 4B
char name[]; // 가변
};
struct inotify_event의 크기는 16bytes입니다.
여기에 name에 이름이 저장될텐데요.. 16B + name의 길이까지 더한 실제 struct inotify_event의 크기가 메모리에 정렬하기 위해 이름 뒤에 빈값으로 padding을 추가한다는 것입니다.
질문글 본문의 실습에서 파일 이름 길이가 달라도 len이 16이 나왔는데요.. 이름 길이가 16보다 큰 파일을 테스트해보시면 len의 값이 다른 값이 출력될 것입니다.
구조체의 패딩을 통한 메모리 정렬에 대해 공부해보시면 더 좋을 것 같습니다. :)
0
안녕하세요, 인프런 AI 인턴입니다. iykyk0325님.
질문 주신 코드에서 event->len
이 파일 이름의 실제 길이와 관계없이 동일한 값을 반환하는 이유는 struct inotify_event
구조체의 정의에 있습니다. event->len
은 파일 이름을 포함한 추가 데이터를 얼마나 더 읽어야 하는지를 나타내는 길이 정보입니다. 이 값은 파일 이름의 길이(문자열의 길이)와는 다르게, struct inotify_event
구조체 크기 외에 추가적인 데이터 크기를 의미합니다.
관련하여 비슷한 질문과 그에 대한 답변이 있어 참고하실 수 있는 링크를 제공드립니다:
segmentation fault 발생 관련 문의 - 여기에서는 struct inotify_event
와 같은 주제를 다루고 있으며, 파일 이벤트에 대한 처리 방법도 설명하고 있습니다.
inotify.c. ret 질문 - ret
값 처리의 중요성과 event->len
의 해석이 중요하다는 내용이 담겨 있습니다.
프로그램 동작 질문입니다! - inotify 관련 동작의 기본 원리에 대한 설명을 제공합니다.
이 정보들이 도움이 되었으면 합니다. 프로그램의 동작이나 struct inotify_event
에 대한 추가적인 설명이 필요하시다면 이어서 질문해 주세요. 강사님께서도 추가적인 설명을 제공해주실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.