inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

파일 이벤트 - 라이브 프로그래밍

(char *) event로 하는 이유

267

Jae Ung Yoon

작성한 질문수 6

1

envent 값을 업데이트 하는 과정에서 

왜 (char *) event로 해주어야 하나요??

그냥 event = (struct inotify_event *)(event + sizeof(strcut inotify_event) + event->len);

으로 해주어도 결과가 똑같은데 (char *)의 의미를 잘 모르겠습니다

linux

답변 1

2

런잇(ProgCoach4U)

안녕하세요. Jae Ung Yoon 님.

결론부터 말씀드리자면, (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 언어에서 자주 사용되고, 또 자주 버그를 만들어내는 부분입니다. 반드시 숙지하셔서 실수 없으시길 바라겠습니다.

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

inotify 객체에 등록된 watch descriptor 해제 관련 질문

0

56

2

select API 실습 코드 질문

0

58

2

wsl에서 fcntl사용

0

83

2

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

0

194

2

./stat 파일이름

0

283

2

fopen r, r+모드 차이

0

467

2

강의를 모두 수강하고 스스로 구현하면 좋을 과제나 프로젝트 주제가 있을까요?

0

332

1

pthread 질문

0

426

2

I/O Multiplexing(select) 질문

0

328

1

inotify.c. ret 질문

0

310

1

inotify.c 질의합니다.

1

321

1

child process

0

726

1

read/blocking

0

576

1

flock

0

570

1

system call

0

608

1

pthread_create() 함수 이용했을 때, thread가 두번 호출되는 것 처럼 나타납니다. 왜 그런것인가요?

0

494

1

fork() 함수 사용시 결과 관련 질문

0

386

1

exec 관련 궁금한 사항

0

463

2

파일 디스크립터와 FILE 구조체에 대한 질문

0

563

1

buf 선언에 따른 read() fail 문제

0

257

2

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

0

262

1

2번 multi thread 방법 질문

0

250

1

segmentation fault 발생 관련 문의

1

852

1

라이브 코딩 실습 코드

0

241

1