select.c 관련 질문입니다
while(ret > 0) 루프 안쪽의
event = (struct inotify_event *)(char *)event + sizeof(struct inotify_event) + event->len; 을
event += sizeof(struct inotify_event) + event->len;으로 바꾸어서 실행해보니 실행결과는 동일한데 이렇게 써도 문제없는 건가요?
답변 2
1
안녕하세요. 강덕영님. 답변 드립니다.
결론부터 말씀드리자면, 질문 글과 같이 바꾸시면 안됩니다. 실행 결과가 동일한 것은.. 운이 좋아서 혹은 운이 나빠서 입니다 :( 차근히 설명 드릴게요.
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언어 포인터 덧셈" 정도의 키워드로 검색을 해보니 자세히 소개된 여러 페이지들이 검색되네요. 그럼 열공하세요!
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





