C 언어에서 fopen()으로 얻은 FILE 포인터를 fstat() 같은 저수준 함수에 넘기려면 실제 파일 번호가 필요하다.
작게 실행해 보기
#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;
}
printf("fd=%d\n", fd);
if (fclose(fp) == EOF)
return 1;
return 0;
}FILE 스트림의 실제 번호를 읽는다. 별도로 close(fd)하지 않고 소유자인 fclose(fp)로 정리한다.
반환값과 주의점
성공하면 스트림의 디스크립터, 유효하지 않은 스트림이면 -1이다.
fileno()가 반환한 번호는 FILE 스트림이 소유한다. 번호만 따로 close()하면 스트림이 망가질 수 있으므로 보통 fclose()로 정리한다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기