C 언어에서 열어 둔 파일이나 소켓의 사용이 끝났다면 close()로 디스크립터를 돌려준다.
작게 실행해 보기
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/uio.h>
int main(void) {
FILE *fp = tmpfile();
if (!fp)
return 1;
if (fputs("abcdef", fp) == EOF || fflush(fp) == EOF) {
fclose(fp);
return 1;
}
int fd = fileno(fp);
if (fd < 0) {
fclose(fp);
return 1;
}
int copy = dup(fd);
if (copy < 0) {
fclose(fp);
return 1;
}
if (close(copy) < 0) {
fclose(fp);
return 1;
}
puts("duplicate closed");
if (fclose(fp) == EOF)
return 1;
return 0;
}닫기 연습 대상은 새로 복제한 번호다. 원래 스트림의 번호까지 중복으로 닫지 않는다.
반환값과 주의점
성공은 0, 실패는 -1이다. 쓰기 오류가 닫는 시점에 드러날 수도 있으므로 반환값을 버리지 않는다.
닫은 번호는 다른 파일을 열 때 다시 쓰일 수 있다. 리눅스에서는 close() 오류가 났다고 같은 번호를 무조건 재시도하면 다른 파일을 닫을 위험이 있다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기