강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

베몬아현아사랑해님의 프로필 이미지
베몬아현아사랑해

작성한 질문수

리눅스 시스템 프로그래밍 - 이론과 실습

inotify_event 구조체 질문 [파일 이벤트 - 라이브 프로그래밍]에서...

해결된 질문

작성

·

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;

}

스크린샷 2025-02-27 오전 3.05.55.png.webp

 

답변 2

1

런잇(ProgCoach4U)님의 프로필 이미지
런잇(ProgCoach4U)
지식공유자

안녕하세요 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 구조체 크기 외에 추가적인 데이터 크기를 의미합니다.

관련하여 비슷한 질문과 그에 대한 답변이 있어 참고하실 수 있는 링크를 제공드립니다:

  1. segmentation fault 발생 관련 문의 - 여기에서는 struct inotify_event와 같은 주제를 다루고 있으며, 파일 이벤트에 대한 처리 방법도 설명하고 있습니다.

  2. inotify.c. ret 질문 - ret 값 처리의 중요성과 event->len의 해석이 중요하다는 내용이 담겨 있습니다.

  3. 프로그램 동작 질문입니다! - inotify 관련 동작의 기본 원리에 대한 설명을 제공합니다.

이 정보들이 도움이 되었으면 합니다. 프로그램의 동작이나 struct inotify_event에 대한 추가적인 설명이 필요하시다면 이어서 질문해 주세요. 강사님께서도 추가적인 설명을 제공해주실 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

베몬아현아사랑해님의 프로필 이미지
베몬아현아사랑해

작성한 질문수

질문하기