커널 파일 디스크립터
글쓴이: wdguitar / 작성시간: 일, 2021/10/17 - 10:44오전
파일 디스크립터 란게 정확히는 무엇을 의미하는건가요?
https://elixir.bootlin.com/linux/latest/source/include/linux/fdtable.h#L49
이게 프로세스에 있는 파일 번호 (0-stdin, 1-stdout, 2-stderr) 하고는 다른거죠?
정확히 어떻게 다른지 궁금합니다.
아, 또, 이상한게,
line 64-66, 하나짜리 배열을 왜 만들죠?
unsigned long open_fds_init[1];
이거 그냥 unsigned long open_fds_init; 하면 안되나요?
Forums:
용량을 줄이기 위함이라는데요.
https://lkml.org/lkml/2006/1/3/500
여기 링크에 나온 패치를 보시면 embedded_fd_set 스트럭쳐가 기존보다 크기가 작아져서 open_fds_init에 해당 스트럭쳐를 사용했는데 이걸 그냥 풀어서 길이가 1인 배열로 쓰고 있나 봅니다.
또한 &연산자의 사용을 줄일 수 있는 것 같습니다.
&연산자를 많이 사용하기 싫었나 봅니다.
아래 익명 사용자님 링크를 따라가 보니, 명확한
아래 익명 사용자님 링크를 따라가 보니, 명확한 설명은 없지만, & 를 쓰기 싫어했다는건 맞는가 봅니다.
이런 패치를 보시고 이해가 되신다니, 정말 부럽습니다
이런 패치를 보시고 이해가 되신다니, 정말 부럽습니다. 전 언제 그렇게 될지.
동일 질문이 있네요..
저도 궁금해져서 찾아 봤는데 동일 질문이 있네요..
https://stackoverflow.com/questions/24028874/why-does-such-a-struct-contain-two-array-fields-containing-only-one-element
그런데 명확한 답변은 없나봅니다...
로그인 하는걸 빼먹어서, 답장이 익명이 되었어요.
로그인 하는걸 빼먹어서, 답장이 익명이 되었어요. 다음에는 잘 할께요. :)
일단, 제가 실력이 아직 부족해서 저 패치가 이해는 안됩니다만, size 1 array 는 대충 이해가 됩니다.
위에 언급된것처럼 size[1] 로 정의하면 변수명 자체가 이미 주소값인 경우가 되서, 추가로 & 를 안써도 되는군요.
여기서 바뀐걸 보면 (https://bit.ly/3bsgOLm)
이전 코드에서 사용자가
fdset.close_on_exec_init = some_value;
처럼 사용한다면, 저런식으로 size[1] 배열을 써주지 않을 경우 & 없으면 이유없이 이전 코드가 에러가 나겠네요. 아마 그래서, 같은 이름을 사용하도록 저럴수 밖에 없었던듯 싶네요.그리고, size 1 배열의 하나더 사용예가, 길이를 runtime 에서 설정할수 있는것 같더군요.
가령, buffer 크기를 config 파일에서 받아온 후에 설정해야 한다면, 난감하겠더군요. 컴파일 할때 크기를 알수 없기 때문이죠.
그래서, 크기를 따로 추후에 설정할수 있도록 하는 경우가 있더군요.
예를 한번 만들어 봤습니다.
댓글 달기