LINUX C에서 stdout과 STDOUT_FILENO의 차이점
나는 사이의 차이 궁금 stdout
하고 STDOUT_FILENO
리눅스 C에서을
몇 가지 검색 작업을 마치고 다음과 같은 결론을 내립니다. 검토하고 오류를 수정하도록 도와 주시겠습니까? 감사
stdout
C 언어의 표준 I / O 스트림에 속합니다. 유형이 FILE *이고 stdio.h에 정의 된STDOUT_FILENO
int 유형을 소유하는은에서 정의됩니다unistd.h
. LINUX 시스템의 파일 설명자입니다. 에서는unistd.h
다음과 같이 설명됩니다.
The following symbolic constants shall be defined for file streams: STDERR_FILENO File number of stderr; 2. STDIN_FILENO File number of stdin; 0. STDOUT_FILENO File number of stdout; 1.
그래서 제 생각에는 STDOUT_FILENO
시스템 수준의 호출에 속하며 어느 정도는 시스템 API와 같습니다. STDOUT_FILENO
시스템의 모든 장치를 설명하는 데 사용할 수 있습니다.
stdout
높은 수준의 사실 (사용자 수준?)와에 위치는 세부 사항을 캡슐화 STDOUT_FILENO
. stdout
I / O 버퍼가 있습니다.
그것이 그들의 차이점에 대한 나의 이해입니다. 모든 의견이나 수정을 주시면 감사하겠습니다.
stdout
FILE*
표준 출력 스트림을 제공 하는 "상수"입니다. 따라서 분명히 fprintf(stdout, "x=%d\n", x);
다음과 같은 동작이 있습니다 printf("x=%d\n", x);
. 당신은 사용 stdout
을 위해 <stdio.h>
같은 기능 fprintf
, fputs
등
STDOUT_FILENO
정수 파일 설명자 (실제로는 정수 1)입니다. write
syscall에 사용할 수 있습니다 .
둘 사이의 관계는 STDOUT_FILENO == fileno(stdout)
(당신이 같은 이상한 일을 한 후를 제외하고 fclose(stdout);
, 혹은 일부 freopen
일부 후 fclose(stdin)
당신이 거의 절대해야하는가!보기 이 에 의해 주석으로 JFSebastian )
FILE*
버퍼링되어 있기 때문에 일반적으로 선호합니다 (보통 잘 수행됨). 때로는 fflush
버퍼를 플러시 하기 위해 호출 할 수 있습니다 .
write (2) ( 라이브러리에서 사용) 또는 poll (2) 와 같은 시스템 호출에 파일 설명자 번호를 사용할 수 있습니다 . 그러나 syscall을 사용하는 것은 복잡합니다. 그것은 당신에게 매우 좋은 효율성을 줄 수 있지만 (하지만 코딩하기는 어렵습니다), 매우 자주 라이브러리는 충분히 좋습니다 (그리고 더 이식 가능합니다).stdio
stdio
(물론 #include <stdio.h>
stdio 함수와 #include <unistd.h>
syscall과 같은 다른 헤더에 대해해야합니다 write
. 그리고 stdio 함수는 syscall로 구현되므로 fprintf
를 호출 할 수 있습니다 write
).
'programing' 카테고리의 다른 글
NSString에 영숫자 + 밑줄 문자 만 포함되어 있는지 확인 (0) | 2021.01.09 |
---|---|
Random Forests의 out of bag 오류는 무엇입니까? (0) | 2021.01.09 |
package.json에서 'files'및 'directories'속성을 어떻게 사용합니까? (0) | 2021.01.08 |
JNI 코드에서 예외를 발생시키는 가장 좋은 방법은 무엇입니까? (0) | 2021.01.08 |
공용 속성 및 개인 필드를 사용해야합니까 아니면 데이터에 공용 필드를 사용해야합니까? (0) | 2021.01.08 |