inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

I/O Multiplexing(select) - 라이브 프로그래밍

select.c 관련 질문입니다

해결된 질문

242

강덕영

작성한 질문수 2

1

while(ret > 0) 루프 안쪽의

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

event += sizeof(struct inotify_event) + event->len;으로 바꾸어서 실행해보니 실행결과는 동일한데 이렇게 써도 문제없는 건가요? 

linux

답변 2

1

런잇(ProgCoach4U)

안녕하세요. 강덕영님. 답변 드립니다.

결론부터 말씀드리자면, 질문 글과 같이 바꾸시면 안됩니다. 실행 결과가 동일한 것은.. 운이 좋아서 혹은 운이 나빠서 입니다 :( 차근히 설명 드릴게요.

event 변수는 struct inotify_event의 포인터 입니다. C 언어에서 포인터에 plus 연산을 하면 포인터의 주소값에  해당 자료구조(즉, 여기에서는 struct inotify_event) 크기의 배수만큼 증가합니다. 

쉽게 예를 들자면, char *p; 로 선언된 포인터 p 에 p+=16;을 하면, '원래 주소값 + (1 * 16)'의 값이 포인터 p에 저장됩니다. char의 크기가 1바이트 이기 때문이죠. 만약 int *p로 선언된 포인터 p에 p+=16;을 하면 '원래 주소값 + (4 * 16)'의 값이 포인터 p에 저장됩니다. int의 크기가 4바이트이기 때문입니다.

원본 코드에 대한 부연 설명을 드릴게요. 질문 글에서 원본 코드 부분에 괄호가 빠졌습니다. 원본 코드는 아래와 같습니다.

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

질문글에서 빠뜨리신 괄호는 중요한 의미를 갖습니다. 이 괄호는 event 변수를 char pointer로 casting하여 자료구조의 크기가 1바이트인 포인터로 만들고 나서 sizeof(struct inotify_event) + event->len 만큼을 더해주게 하는 역할을 합니다. 그리고나서 다시 struct inotify_event 포인터로 casting 해 event 포인터 변수에 저장하게 됩니다.

만약, 질문글에서 작성하신 코드를 반영하자면 아래와 같이 동작할 것 입니다. struct inotify_event의 사이즈는 16바이트이므로 'event 포인터 주소값 + 16*(16 + event->len)'을 event 변수에 저장합니다. 

이해가 되셨는지 모르겠네요. 잘 이해가 되시지 않으신다면 관련 내용을 좀 더 찾아보시길 추천해 드립니다. C 언어를 다루면서 꼭 아셔야 할 내용인 것 같습니다. "C언어 포인터 덧셈" 정도의 키워드로 검색을 해보니 자세히 소개된 여러 페이지들이 검색되네요. 그럼 열공하세요! 

0

강덕영

자료형에 대해 너무 안일하게 생각하고 연산을 한 것 같네요. 감사합니다! 이해가 됐습니다.

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

0

36

2

select API 실습 코드 질문

0

40

2

wsl에서 fcntl사용

0

72

2

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

0

179

2

./stat 파일이름

0

272

2

fopen r, r+모드 차이

0

460

2

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

0

326

1

pthread 질문

0

419

2

I/O Multiplexing(select) 질문

0

324

1

inotify.c. ret 질문

0

302

1

inotify.c 질의합니다.

1

317

1

child process

0

715

1

read/blocking

0

564

1

flock

0

565

1

system call

0

598

1

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

0

487

1

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

0

371

1

exec 관련 궁금한 사항

0

450

2

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

0

552

1

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

0

251

2

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

0

254

1

2번 multi thread 방법 질문

0

242

1

segmentation fault 발생 관련 문의

1

842

1

라이브 코딩 실습 코드

0

235

1