stdout과 STDOUT_FILENO의 차이점
어떻게 다른지 궁금해서stdout
그리고.STDOUT_FILENO
Linux C에 있습니다.
몇 가지 조사 끝에 다음과 같은 결론을 도출했다.리뷰하고 틀린 부분이 있으면 고쳐주실 수 있나요?고마워요.
stdout
표준 C 언어 I/O 스트림에 속하며 유형은 FILE*이며 stdio.h에서 정의됩니다.STDOUT_FILENO
int 타입을 가지는 것은, 다음의 URL 로 정의되어 있습니다.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
시스템
둘의 관계는STDOUT_FILENO == fileno(stdout)
(당신이 이런 이상한 일을 한 후를 제외하고)fclose(stdout);
또는 일부freopen
조금 있다가fclose(stdin)
절대 해서는 안 되는 일!J.F.의 코멘트에 의하면, 이것을 봐 주세요.세바스찬)
평소에는FILE*
버퍼링되어 있기 때문에(보통 퍼포먼스가 좋기 때문에).가끔 전화하고 싶을 때가 있어요.fflush
버퍼를 플래시합니다.
write(2)와 같은 syscall에는 파일 기술자 번호를 사용할 수 있습니다(이 번호는stdio
또는 poll(2)을 참조해 주세요.하지만 syscalls를 사용하는 것은 엉터리입니다.매우 뛰어난 효율을 얻을 수 있을지는 모르지만(단, 이것은 코드화하기 어렵습니다), 대부분의 경우,stdio
라이브러리로 충분합니다(휴대성이 향상됩니다).
(물론, 당신은#include <stdio.h>
stdio 함수의 경우,#include <unistd.h>
- 및 기타 헤더 - 시스템스콜을 위해write
stdio 함수는 syscall로 구현되어 있습니다.fprintf
전화할 수 있다write
).
언급URL : https://stackoverflow.com/questions/12902627/the-difference-between-stdout-and-stdout-fileno
'programing' 카테고리의 다른 글
구조체에 GDB에 있는 필드를 표시하려면 어떻게 해야 합니까? (0) | 2022.07.26 |
---|---|
명명된 경로에 대한 매개 변수가 없습니다."x"가 정의되어야 합니다. (0) | 2022.07.26 |
Vuex에서 Vue 라우터 파라미터를 취득하는 방법 (0) | 2022.07.21 |
vue를 사용하여 다른 페이지로 라우팅하고 해당 페이지의 제목과 텍스트를 표시하는 방법은 무엇입니까? (0) | 2022.07.21 |
어레이 요소를 제거하지 못했습니다. (0) | 2022.07.21 |