오랫만에 글을 씁니다. 이번 시간에는 파일 포인터를 넘겨주면 파일 디스크립터를 돌려주는 fileno 함수를 배워보겠습니다. 사실 빠른 입출력을 위해 많이 쓴다는 fastio의 write를 배우기 위해서, 배운다는 건 비밀이지만요.

 


  이 함수의 원형은 다음과 같습니다.

 

 stdio.h에 선언이 되어 있는 함수입니다. FILE 포인터를 넘겨주면, 그것과 연관된 파일 디스크립터를 돌려주는 역할을 합니다.

 

 

 stdio.h에 보시면 bits/types/FILE.h가 보이는데요. 무엇인지 모르겠지만, 저기에 무언가가 있을 듯 싶으니, 타고 들어가 보겠습니다.

 

 

 그러면, _IO_FILE이라는 것을 FILE로 재정의를 한 무언가가 보이는데요. 글쎄요. 일단, 이것도 타고 들어가 보겠습니다.

 

 

 그러면 _IO_FILE 구조체가 보이는데요. 밑으로 타고 내려가다 보면, 뜬금없이 이상한 변수들이 나옵니다.

 

 

 _fileno가 보이는데요. 여기까지 보면 FILE에 관한 것을 담고 있는 무언가가 fileno도 같이 담고 있다는 것을 볼 수 있어요. 그렇다면, 파일에 대한 정보를 담고 있는 것을 토대로, 디스크립터 번호를 가져온다고 생각하셔도 무난하겠군요. fastio에 나오는 write 함수를 실험해 보기 위해서는 이 번호를 알아야 한다는 것도 챙겨가시면 좋을 듯 싶습니다.

 


 이제 예제를 보도록 하겠습니다.

 

 write 모드로 1.txt를 엽니다. 파일 포인터 fp는 이것과 연관이 되어 있습니다.

 

 

 다음에, FILE과 연관된 무언가에서, 파일 디스크립터를 가지고 옵니다. FILE 포인터로부터 번호를 얻어온 셈입니다. 그리고, 이 번호를 1번째 인자로, 버퍼를 2번째 인자로, 3번째 인자로 길이 정보를 넣어서 파일에 씁니다. 이것을 조금 더 응용하면, 고수 분의 글 처럼 이렇게도 쓸 수 있습니다. Fast Output만 보셔도 되겠네요. 당연하게도 저 글은 즐겨찾기 해 두시면 좋습니다. 나중에 OS 카데고리에 글을 쓸 때도 나올 것이거든요. 공룡책에서 2 ~ 4 단원 정복할 정도의 글감을 저 글 하나에서 뽑아낼 수 있기도 하고요.

 

 

 결과는 위와 같습니다. 단지, 우리는 파일 디스크립터를 받아서, write를 했을 뿐입니다.

 

 

 이제, 먼저 파일을 닫고 (스트림 같은 것도 닫힐 겁니다), 그것을 디스크립터로 바꾸어 보겠습니다.

 

 

 -1이 떨어지네요. 이는, fp와 연관이 된 스트림이 유효하지 않기 때문입니다.