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

­윤영진[정보보안암호수학과]님의 프로필 이미지
­윤영진[정보보안암호수학과]

작성한 질문수

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

파일 이벤트 - 라이브 프로그래밍 에서 캐스팅 질문

해결된 질문

작성

·

177

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
안녕하세요 강사님. 좋은 강의 잘 듣고 있습니다.
 
다름이 아니라 "파일 이벤트 - 라이브 프로그래밍" 에서 질문이 있습니다.
 
라이브 코딩을 해주시는 중에 파일 생성 삭제에 대한 이벤트 로그 출력 부분을 작성 해주셨는데요. inotify_event 포인터로 선언되어있는 event 변수를 (char *)로 캐스팅 하는 이유에 대해서 문의 드립니다. 해당 부분의 소스는 아래와 같습니다.
 
감사합니다.
 
while(ret > 0){
if(event->mask & IN_CREATE) {
printf("file %s is created\n",event->name);
}
if(event->mask & IN_DELETE){
printf("file %s is deleted\n",event->name);
}
ret -= (sizeof(struct inotify_event) + event->len);
 
event = (struct inotify_event *)((char *)event + sizeof(struct inotify_event) + event->len); <-- (char *)?
}
 

답변 1

0

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

안녕하세요. 윤영진님

 

예전에 다른 수강생 분께서도 동일한 질문을 하셨었는데요, 그 때 달았던 답변 그대로 달겠습니다. 

----

결론부터 말씀드리자면, (char *)를 붙인 코드와 붙이지 않은 코드는 완전히 다르게 동작합니다. 

C언어의 포인터에 + 1과 같은 산술 연산을 하게되면 그 포인터의 자료형의 크기만큼 더하게 됩니다. event 포인터는 inotify_event 구조체의 포인터이기 때문에 "event + 10"을 하게 되면 event 포인터가 가리키는 "주소값 + (10 * sizeof(struct inotify_event))"가 됩니다. 

위 코드의 목적은 event 포인터가 가리키는 주소값에 inotify_event 구조체의 크기와 event->len 값을 더한 만큼 포인터를 옮겨주려는 것입니다. 그래서 inotify_event 구조체를 char 포인터로 캐스팅 한 후 산술 연산을 하게 되는 것입니다. char는 size가 1이기 때문에 포인터의 산술 연산이지만 더한 값만큼 주소가 옮겨지게 되겠죠 :)

char 포인터로 캐스팅하는 코드를 제거해도 제거하기 전과 동일하게 동작하는 것은 단순히 운이 좋아서(?) 입니다 :) 이벤트가 한 번에 여러 개가 올라왔다면 while() 내에서 event 포인터를 옮겨가며 처리하게 될텐데, 이게 한 번에 하나의 이벤트가 올라온 경우라면 엉뚱한 곳을 가리키는 event 포인터를 사용할 일이 없어서 아마 제대로 동작했을 수 있습니다. 

이해가 되셨을지 모르겠네요. 포인터의 연산은 C 언어에서 자주 사용되고, 또 자주 버그를 만들어내는 부분입니다. 반드시 숙지하셔서 실수 없으시길 바라겠습니다.

더 궁금한 사항 있으시면 추가 질문 남겨주세요~ 

----

그리고 위 코드에 버그가 있습니다. while 문의 가장 아래 두 줄의 위치가 바뀌어야 합니다. 

event = (struct inotify_event *)((char *)event + sizeof(struct inotify_event) + event->len);
ret -= (sizeof(struct inotify_event) + event->len);

 

요런 순서가 되어야 정상동작하게 됩니다. 첫 줄에서 event 포인터의 주소를 옮겨주고, 두번째 줄에서 ret 값에서 event 포인터를 이동한 만큼 빼주어야 정상동작합니다. 라이브 프로그래밍 진행 시 미스가 있었습니다.ㅠ 이 부분도 같이 확인해주세요!

감사합니다!

 

 

 

네 강사님 친절한 답변 감사드립니다. :)

­윤영진[정보보안암호수학과]님의 프로필 이미지
­윤영진[정보보안암호수학과]

작성한 질문수

질문하기