• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

segmentation fault 발생 관련 문의

22.03.24 22:24 작성 조회수 545

1

안녕하세요?

실습 중에 궁금한 점이 생겨 아래와 같이 문의를 남깁니다.

라즈베리파이4 라즈비안 환경에서 inotify.c 파일을 컴파일하였습니다.

컴파일된 실행 파일을 실행 후, watch로 지정한 directory에 파일을 생성하니, "file (file name) is created"라는 문자열이 출력되고 바로 segmentation fault가 발생했습니다.

1. 확인해보니 read로 읽은 buf 내용을 모두 출력하는 while문의 마지막 행에서 ret 값을 (sizeof(struct inotify_event) + event->len) 길이만큼 감소시키는데, 바로 윗 행에서 event 포인터 값을 미리 변경하기 때문에 event->len의 값이 실제로 방금 읽은 데이터의 길이가 아닌 다른 곳을 가리키고 있어서, 모든 데이터를 읽었음에도 while문에서 빠져나오지 못하고 event가 가리키는 필드를 읽으려고 해서  발생하는 문제이지 않았을까 생각했습니다. 그래서 while문 마지막 2줄의 위치를 변경하니 segmentation fault가 발생하지 않고 파일 생성 및 삭제 이벤트를 정상적으로 출력하는 것을 확인할 수 있었습니다.  하지만 강사님의 라이브 프로그래밍에서는 이러한 문제가 발생하지 않는 것을 보니, 제가 잘못 하고 있는것이 있지 않을까 싶어 문의드립니다.

2. 그리고 파일 생성 이벤트를 정상적으로 read했을 때, 생성한 file 이름의 길이에 상관없이 event->len이 16으로 고정되어 출력됩니다만, 이것은 라즈비안 커널에서 고정을 해 놓았을까요?

이상입니다. 감사합니다.

답변 1

답변을 작성해보세요.

1

안녕하세요. 백재민님

답변 드립니다.

1. 지적하신 부분이 맞습니다. event를 옮기고 길이를 계산하니 엉뚱한 곳에서 엉뚱한 값을 읽어 오류가 발생한 것입니다. 말씀하신 대로 마지막 두 줄의 위치를 변경하는게 맞겠습니다. 좋은 지적 감사합니다. 

2. 최신 라즈베리파이 커널 헤더를 보니 일반 리눅스 커널과 특별히 다른 점은 없었습니다. struct inotify_event는 똑같이 생겼더라구요. 그런데 항상 16을 리턴한다는 것은 일반적이지 않은 동작 같네요. 파일 시스템 쪽에서 고정해놓은 것으로 추정됩니다. 한가지 궁금한 점은 길이가 16이상 되는 것은 이벤트가 어떻게 올라올까요? 궁금하네요ㅎㅎ

좋은 지적 해주셔서 감사합니다. 그리고 2번 질문은 정확한 답변 드리지 못해 죄송합니다.