fopen을 하고 난 뒤에는 fclose를 호출하라고 합니다. 사실, fopen과 fclose는 한 쌍처럼 따라다닌다고 봐도 무난하긴 하겠네요. 만약에, 닫지 않으면 어떤 일이 일어날까요?
저는, 1.txt를 열기만 하고 닫지는 않을 겁니다.
fclose.c를 보겠습니다.
1000번 fopen 함수를 수행합니다. 닫는 것을 호출하지 않습니다. 그리고 나서, file open end를 찍고 계속 루프를 돕니다. 이 정도로 해석하시면 될 듯 싶습니다.
이제 코드를 컴파일 해서 실행시켜 보겠습니다.
그리고 다른 터미널에서 fclose에 대한 것을 보면, pid가 4810임을 알 수 있습니다.
proc/4810/fd로 가서, ls를 쳐 보겠습니다. 그러면, 꽤 많은 무언가가 출력됨을 알 수 있습니다. 1.txt와 관련이 된 무언가만 뽑아보겠습니다.
ls -ail의 결과물 중에서 1.txt가 들어간 라인만 뽑고, 거기서, line수를 세려면 ls -ail | grep 1.txt | wc -l 을 치시면 됩니다. 그러면 1000이 나오는데요. fclose를 호출하지 않았기 때문에, 1000개의 무언가를 4810번 프로세스가 계속 물고 있음을 알 수 있습니다. 무엇인지는 모르겠지만, 필요도 없는 자원을 4810번이 계속 물고 있는 것은 좋은 것이 아닙니다.
그러면 어떻게 하면 좋을까요? 닫아주면 됩니다.
fclose는 pointed가 된 stream을 flush하고, 파일 디스크립터를 닫는다고 man 페이지에 나와 있습니다.
fclose.c를 요렇게 바꿔보고 다시 돌려보도록 하겠습니다.
6649번 프로세스로 올라왔습니다. file open end가 나왔을 때, /proc/6649/fd로 들어가 보겠습니다.
ls -ail을 쳐보면, 3개의 디스크립터만 있음을 알 수 있습니다. fclose를 해줌으로서, 필요 없는 자원을 계속 물고 있지 않게 되었습니다. 여담으로, proc/xxx/fd 이 디렉토리는 익숙해 지시는 게 좋겠습니다. 나중에 프로세스와 스레드 차이를 언급할 때 또 나올 지도 모르기 때문입니다.
'코딩 > C' 카테고리의 다른 글
10시간동안 원인 찾아 헤멨던 string c_str과 dangling pointer (0) | 2020.09.16 |
---|---|
c언어 fileno 함수 : 파일 포인터를 데스크립터로 바꾼다. (0) | 2020.09.05 |
c언어 define문 : 상수를 정의할 때 쓴다. (0) | 2020.07.18 |
c언어 fwrite 함수 : 레코드를 byte 단위로 쓴다. (0) | 2020.05.31 |
c언어 fread 함수 : 파일로부터 데이터를 읽는 또 다른 함수 (0) | 2020.05.12 |
최근댓글