programing

LINUX C에서 stdout과 STDOUT_FILENO의 차이점

nasanasas 2021. 1. 8. 08:20
반응형

LINUX C에서 stdout과 STDOUT_FILENO의 차이점


나는 사이의 차이 궁금 stdout하고 STDOUT_FILENO리눅스 C에서을

몇 가지 검색 작업을 마치고 다음과 같은 결론을 내립니다. 검토하고 오류를 수정하도록 도와 주시겠습니까? 감사

  • stdoutC 언어의 표준 I / O 스트림에 속합니다. 유형이 FILE *이고 stdio.h에 정의 된

  • STDOUT_FILENOint 유형을 소유하는은에서 정의됩니다 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. stdoutI / O 버퍼가 있습니다.

그것이 그들의 차이점에 대한 나의 이해입니다. 모든 의견이나 수정을 주시면 감사하겠습니다.


stdoutFILE*표준 출력 스트림을 제공 하는 "상수"입니다. 따라서 분명히 fprintf(stdout, "x=%d\n", x);다음과 같은 동작이 있습니다 printf("x=%d\n", x);. 당신은 사용 stdout을 위해 <stdio.h>같은 기능 fprintf, fputs

STDOUT_FILENO정수 파일 설명자 (실제로는 정수 1)입니다. writesyscall에 사용할 수 있습니다 .

둘 사이의 관계는 STDOUT_FILENO == fileno(stdout)

(당신이 같은 이상한 일을 한 후를 제외하고 fclose(stdout);, 혹은 일부 freopen일부 후 fclose(stdin)당신이 거의 절대해야하는가!보기 에 의해 주석으로 JFSebastian )

FILE*버퍼링되어 있기 때문에 일반적으로 선호합니다 (보통 잘 수행됨). 때로는 fflush버퍼를 플러시 하기 위해 호출 할 수 있습니다 .

write (2) ( 라이브러리에서 사용) 또는 poll (2) 와 같은 시스템 호출에 파일 설명자 번호를 사용할 수 있습니다 . 그러나 syscall을 사용하는 것은 복잡합니다. 그것은 당신에게 매우 좋은 효율성을 줄 수 있지만 (하지만 코딩하기는 어렵습니다), 매우 자주 라이브러리는 충분히 좋습니다 (그리고 더 이식 가능합니다).stdiostdio

(물론 #include <stdio.h>stdio 함수와 #include <unistd.h>syscall과 같은 다른 헤더에 대해해야합니다 write. 그리고 stdio 함수는 syscall로 구현되므로 fprintf를 호출 할 수 있습니다 write).

참조 URL : https://stackoverflow.com/questions/12902627/the-difference-between-stdout-and-stdout-fileno-in-linux-c

반응형