파일 포인터 (FILE * fp)를 파일 디스크립터 (int fd)로 어떻게 변환 할 수 있습니까?


174

나는이 FILE *호출에 의해 반환을 fopen(). 전화를 걸려면 파일 설명자를 가져와야 fsync(fd)합니다. 파일 포인터에서 파일 디스크립터를 얻는 기능은 무엇입니까?


또는 open (2)로 파일을 열면 처음부터 파일 디스크립터가
생깁니다.

답변:


214

올바른 기능은 int fileno(FILE *stream)입니다. 에서 찾을 수 있으며 <stdio.h>POSIX 표준이지만 표준 C는 아닙니다.


4
엄밀히 말하면, 함수가 실제로 표준 C 라이브러리의 일부라면 헤더 또는 라이브러리를 언급 할 필요가 없습니다. 그러나 표준이 아니기 때문에 헤더를 언급하는 것이 합리적 일 수 있습니다.
AnT

20
최소한 컴파일러에서 프로토 타입을 기대하는 경우 표준 C 라이브러리의 함수에 액세스하려면 헤더를 포함해야합니다. 헤더가 없으면 C 파일의 시작 부분에 이름이 정의되지 않습니다.
Phil Miller

1
@Novelocrat : 나는 #include아무것도 필요가 없다는 것을 의미하지 않았습니다 . 나는 단지 표준 함수에 대한 적절한 헤더의 이름을 찾기가 항상 쉽다는 것을 의미했습니다 . 즉, 답변에 정확한 헤더 이름을 언급하는 것이 중요하지 않습니다.
AnT

9
이것은 좋은 대답이지만 이것이 표준 c 함수가 아니라 posix 함수라는 점은 주목할 가치가 있습니다.
Evan Teran

6
파일 디스크립터는 유닉스 (Linux에서는 open (2), open (3))가 아니기 때문에 C 표준에는 없습니다.
사용자가 아닌 사용자

42

fileno(FILE *)파일 디스크립터를 리턴 하더라도 stdio의 버퍼를 우회하지 않도록주의하십시오. 버퍼 데이터 (읽기 또는 언 플러시 쓰기)가있는 경우 파일 디스크립터에서 읽기 / 쓰기를 수행하면 예기치 않은 결과가 발생할 수 있습니다.

부수적 인 질문 중 하나에 답하고 파일 설명자를 FILE 포인터로 변환하려면 다음을 사용하십시오. fdopen(3)


1
나는 이것이 이것을 구체적으로 검색하는 사람들에게 도움이되었다고 생각하지 않으며, 이것은이 글이 쓰여지기 한 달 전에 OP 게시물의 주석 섹션에서 이미 답변되었습니다. 이것은 실제 정보가 아닌 논리적 인 설명입니다.
kevr

4
너무 중요한 의견은 답변으로 제기되어야합니다. 댓글의
상당 부분
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.