표준 스트림

Standard streams

컴퓨터 프로그래밍에서 표준 스트림은 컴퓨터 프로그램이 실행을 시작할 때 컴퓨터 프로그램과 환경 간에 상호 연결된 입력 및 출력 통신[1] 채널입니다.3개의 입력/출력(I/O) 연결을 표준 입력(stdin), 표준 출력(stdout) 및 표준 오류(stderr)라고 합니다.원래 I/O는 물리적으로 연결된 시스템 콘솔(키보드를 통한 입력, 모니터를 통한 출력)을 통해 이루어졌지만 표준 스트림은 이를 추상화합니다.인터랙티브셸을 통해 명령어가 실행되는 경우 스트림은 일반적으로 셸이 실행되고 있는 텍스트 단말기에 연결되지만 리다이렉션 또는 파이프라인사용하여 변경할 수 있습니다.일반적으로 하위 프로세스는 상위 프로세스의 표준 스트림을 상속합니다.

어플

입력, 출력 및 오류에 대한 표준 스트림.

일반적으로 사용자는 표준 스트림을 입력 장치에서 들어오는 데이터를 처리하거나 응용 프로그램에서 데이터를 쓰는 입력 및 출력 채널로 알고 있습니다.데이터는 인코딩이 포함된 텍스트 또는 이진 데이터일 수 있습니다.많은 최신 시스템에서 프로그램의 표준 오류 스트림은 일반적으로 오류 분석을 위해 로그 파일로 리디렉션됩니다.

스트림을 사용하여 응용 프로그램을 체인할 수 있습니다.즉, 한 프로그램의 출력 스트림을 다른 응용 프로그램에 대한 입력 스트림으로 리다이렉트할 수 있습니다.많은 operating system에서는, 애플리케이션명을 세로 막대 문자로 구분해 일람표시하고 있습니다.이 때문에, 파이프라인 문자라고 불리는 경우가 많습니다.잘 알려진 예로는 디스플레이 출력 스트림의 표시를 사용자가 제어할 수 있도록 more 등의 페이지 표시 어플리케이션을 사용하는 것이 있습니다.

배경

Unix 이전의 대부분의 운영 체제에서 프로그램은 적절한 입력 및 출력 장치에 명시적으로 연결해야 했습니다.OS 고유의 복잡함으로 인해 이 작업은 지루한 프로그래밍 작업이 되었습니다.많은 시스템에서 펀치 카드 리더, 자기 테이프 드라이브, 디스크 드라이브, 라인 프린터, 카드 펀치 또는 인터랙티브 터미널의 경우 환경 설정을 제어하고 로컬 파일 테이블에 액세스하여 원하는 데이터 세트를 결정하고 하드웨어를 올바르게 취급해야 했습니다.

Unix의 몇 가지 획기적인 발전 중 하나는 추상적인 장치였고, 이로 인해 프로그램이 어떤 종류의 장치와 통신하고[citation needed] 있는지 알거나 신경 쓸 필요가 없어졌습니다.오래된 운영체제는 프로그래머에게 레코드 구조를 강요하고 종종 비직교 데이터 의미론 및 장치 제어를 강요합니다.Unix는 데이터 스트림(파일 끝까지 읽을 수 있는 데이터 바이트 순서)의 개념을 통해 이러한 복잡성을 없앴습니다.또한 프로그램은 원하는 바이트와 필요하지 않은 바이트를 쓸 수 있으며 바이트의 수 또는 그룹화를 쉽게 선언할 수 없습니다.

또 다른 Unix의 비약적인 발전은 입력과 출력을 각각 터미널[citation needed] 키보드와 터미널 디스플레이에 자동으로 연관짓는 것이었습니다.프로그램(및 프로그래머)은 (다른 패러다임을 선택하지 않는 한) 일반적인 입출력 프로그램의 입출력을 확립하기 위해 전혀 아무것도 하지 않았습니다.이와는 대조적으로, 이전의 운영 체제에서는, 접속을 확립하기 위해서, 통상, 복잡한 작업 제어 언어가 필요했습니다.그렇지 않으면,[citation needed] 프로그램에 의해서 동등한 부하를 조정해야 했습니다.

Unix가 표준 스트림을 제공했기 때문에 Unix C 런타임 환경도 이를 지원해야 했습니다.그 결과 운영체제에 관계없이 대부분의 C 런타임 환경(C의 후속 환경)은 동등한 기능을 제공합니다.

표준 입력(stdin)

표준 입력은 프로그램이 입력 데이터를 읽는 스트림입니다.프로그램은 읽기 작업을 사용하여 데이터 전송을 요청합니다.스트림 입력이 필요한 프로그램도 있습니다.예를 들어 dir ls 프로그램(디렉토리에 포함된 파일 이름을 표시)은 명령줄 인수를 사용하지만 스트림 데이터 입력 없이 작업을 수행할 수 있습니다.

리디렉션되지 않는 한 표준 입력은 상위 프로세스에서 상속됩니다.인터랙티브셸의 경우 보통 키보드와 관련되어 있습니다.

표준 입력의 파일 기술자는 0(제로), POSIX <unistd 입니다.h> 정의는STDIN_FILENO; 대응하는 C <stdio.h> 변수는FILE* stdin마찬가지로 C++ <iostream> 변수도std::cin.

표준 출력(stdout)

표준 출력은 프로그램이 출력 데이터를 쓰는 스트림입니다.프로그램이 쓰기 작업과 함께 데이터 전송을 요청합니다.모든 프로그램이 출력을 생성하는 것은 아닙니다.예를 들어 file rename 명령어(다양하게 mv, move 또는 ren)는 성공 시 자동으로 실행됩니다.

리디렉션되지 않는 한 표준 출력은 상위 프로세스에서 상속됩니다.인터랙티브 셸의 경우, 보통 프로그램을 시작한 텍스트 터미널입니다.

표준 출력의 파일 기술자POSIX <unistd>입니다.h> 정의는STDOUT_FILENO; 대응하는 C <stdio.h> 변수는FILE* stdout마찬가지로 C++ <iostream> 변수도std::cout.

표준 오류(stderr)

표준 오류는 프로그램에서 오류 메시지 또는 진단을 출력하기 위해 일반적으로 사용되는 또 다른 출력 스트림입니다.이 스트림은 표준 출력과는 무관하며 개별적으로 리다이렉트할 수 있습니다.

이것에 의해, 반증명 문제가 해결되어 출력과 에러를 구별할 수 있습니다.또한 함수가 값의 쌍을 반환하는 것과 비슷합니다.「반증명서 문제를 참조해 주세요. 다중 가치 수익률.통상적인 수신처는, 표준 출력이 리다이렉트 되어도(즉시 관찰되지 않는) 최고의 가능성을 제공하기 위해서 프로그램을 기동한 텍스트 단말입니다.예를 들어 파이프라인 내의 프로그램 출력은 다음 프로그램 입력이나 텍스트 파일로 리다이렉트되지만, 각 프로그램으로부터의 에러는 텍스트 단말기에 직접 전달되기 때문에 [2]사용자가 실시간으로 확인할 수 있다.

표준 출력과 표준 에러는 텍스트 단자 등 같은 수신처에 지시하는 것이 허용 가능하며 정상입니다.버퍼링이 수반되지 않는 한, 메시지는 프로그램의 기입 순서와 같은 순서로 표시됩니다.예를 들어 일반적인 상황에서는 표준 에러 스트림은 버퍼링 해제되지만 표준 출력 스트림은 라인 버퍼링됩니다.이 경우 표준 출력 스트림 버퍼가 아직 가득 차지 않은 경우 나중에 표준 에러에 쓴 텍스트가 단말기에 표시될 수 있습니다.

표준 에러의 파일 기술자는, POSIX 에 의해서 2(2)로 정의됩니다.< unistd > h > 헤더 파일에 기호가 표시됩니다.STDERR_FILENO;[3] 대응하는 C <stdio.h> 변수는FILE* stderrC++ <iostream> 표준 헤더에는 이 스트림과 관련된 다음 두 가지 변수가 있습니다.std::cerr그리고.std::clog이 경우, 전자는 다른 모든 C++ 스트림과 동일한 버퍼링 메커니즘을 사용합니다.

Bourne 스타일의 셸을 사용하면 표준 에러를 표준 출력의 수신처로 리다이렉트 할 수 있습니다.

2>&1

csh-style 쉘을 사용하면 표준 에러를 표준 출력과 같은 수신처로 리다이렉트 할 수 있습니다.

>&

1970년대에 사용자 [4]단말기에 표시되지 않고 오류 메시지가 활자로 표시되면서 여러 번 낭비된 사진 타이핑 실행이 종료된 후 Unix에 표준 오류가 추가되었습니다.

타임라인

1950년대:포트란

Fortran은 Unix 파일 기술자와 동등합니다.관례상, 많은 Fortran 구현은 장치 번호를 사용합니다.UNIT=5stdin의 경우UNIT=6스텐드아웃용UNIT=0stderr를 위해.Fortran-2003에서, 본질은ISO_FORTRAN_ENV모듈은 지정된 상수를 포함하도록 표준화되었습니다.INPUT_UNIT,OUTPUT_UNIT,그리고.ERROR_UNIT유닛 번호를 포터블하게 지정합니다.

! FORTRAN 77의 예       프로그램.주된         정수번호         읽어주세요(구성 단위=5,*) 번호         기입하다(구성 단위=6,'(A, I3)') '번호: ',번호       끝. 
! Fortran 2003의 예 프로그램.주된   사용하다iso_fortran_env   암묵적 없음   정수 :: 번호   읽어주세요 (구성 단위=입력_유닛,*) 번호   쓰다 (구성 단위=출력_유닛,'(a,i3)') '번호: ', 번호 종료 프로그램 

1960: ALGOL 60

ALGOL 60은 표준 파일 [citation needed]액세스가 없다는 비판을 받았습니다.

1968: ALGOL 68

ALGOL 68의 입출력 설비는 총칭으로 트랜스풋이라고 [5]불립니다.Koster전송량 표준의 정의를 조정했습니다.이 모델에는 세 가지 표준 채널이 포함되어 있습니다.stand in,stand out,그리고.stand back.

# ALGOL 68 예 # main:(REAL 번호; getf(stand in, ($g$, number)), printf(($" 번호는 "g(6,4)")입니다.또는 "$number"; #OR # putf(standing, ($)" 번호는 "g(6,4)"!", "newline(standout)"입니다.
입력: 출력:
3.14159
번호: +3.142 또는 번호: +3.142!

1970년대: C 및 Unix

C 프로그래밍 언어에서는 표준 입력, 출력 및 오류 스트림이 각각 [6]기존 Unix 파일 기술자 0, 1, 2에 부가된다.POSIX 환경에서는 <unistd.h> 매직넘버 대신 STDIN_FILENO, STDOUT_FILENO 또는 STDERR_FILENO 정의를 사용해야 합니다.파일 포인터 stdin, stdoutstderr도 제공됩니다.

Ken Thompson(원래 Unix 운영 체제의 설계자 및 구현자)은 버전 5 Unix에서 "-"를 표준 입력으로 받아들이도록 정렬을 수정했으며, 이는 다른 유틸리티로 확산되어 버전 8에서 운영 체제의 일부가 되었습니다.Dennis M 이후 버전 6에서는 진단이 표준 출력의 일부였습니다. Ritchie는 표준오차의 [7]개념을 만들었다.

1995년:자바

Java에서는 표준 스트림을 다음과 같이 참조합니다.System.in(stdin의 경우),System.out(stdout용) 및System.err(stderr의 [8]경우).

일반의 정적인 무효 주된(스트링 args[]) {     해라 {         버퍼리더 br =            신규 버퍼리더(신규 Input Stream Reader(시스템..));         스트링 s = br.회선 읽기();         이중으로 하다 번호 = 이중.해석 이중(s);         시스템..나가..인쇄("번호는:" + 번호);     } 또 만나 (예외. e) {         시스템..에러.인쇄("에러:" + e.get Message());     } } 

2000년대:.그물

C# 및 기타.NET 언어, 표준 스트림은 다음에서 참조됩니다.System.Console.In(stdin의 경우),System.Console.Out(스탠드아웃용) 및System.Console.Error(stderr의 [9]경우).stdin 스트림 및 stdout 스트림의 기본 읽기 및 쓰기 기능도 클래스를 통해 직접 액세스할 수 있습니다.System.Console(예:System.Console.WriteLine()대신 사용할 수 있다System.Console.Out.WriteLine()).

System.Console.In,System.Console.Out그리고.System.Console.Error이다System.IO.TextReader(stdin) 및System.IO.TextWriter(stdout, stderr) 오브젝트.기본 표준 스트림에 텍스트 단위로만 액세스할 수 있습니다.표준 스트림에 대한 완전한 바이너리 액세스는System.IO.Stream에 의해 반환된 오브젝트System.Console.OpenStandardInput(),System.Console.OpenStandardOutput()그리고.System.Console.OpenStandardError()각각 다음과 같다.

// C#의 예 일반의 정적인 인트 주된(스트링[] args) {     해라 {         스트링 s = 시스템..콘솔..라인 읽기();         이중으로 하다 번호 = 이중으로 하다.해석(s);         시스템..콘솔.나가..기입선("번호: {0:F3}}", 번호);         돌아가다 0;      // Parse()가 예외를 발생시킨 경우     } 또 만나 (Argument Null Exception(인수 Null 예외)) {          시스템..콘솔.에러.기입선("번호가 입력되지 않았습니다!");     } 또 만나 (Format Exception(형식 예외)) {         시스템..콘솔.에러.기입선("지정된 값이 올바른 숫자가 아닙니다!");     } 또 만나 (오버플로예외.) {         시스템..콘솔.에러.기입선("지정된 숫자가 너무 큽니다!");     }      돌아가다 -1; } 
' Visual Basic 。NET의 예  일반의 기능. 주된() ~하듯이 정수     해라         어둡다 s ~하듯이 스트링 = 시스템..콘솔.[].라인 읽기()         어둡다 번호 ~하듯이 이중 = 이중.해석(s)         시스템..콘솔.나가..기입선("번호: {0:F3}}", 번호)         돌아가다 0      Parse()가 예외를 발생시킨 경우     또 만나 ex ~하듯이 시스템..Argument Null Exception(인수 Null 예외)         시스템..콘솔.[에러].기입선("번호가 입력되지 않았습니다!")     또 만나 ex2 ~하듯이 시스템..Format Exception(형식 예외)         시스템..콘솔.[에러].기입선("지정된 값이 올바른 숫자가 아닙니다!")     또 만나 ex3 ~하듯이 시스템..오버플로예외.         시스템..콘솔.[에러].기입선("지정된 숫자가 너무 큽니다!")     끝. 해라      돌아가다 -1 끝. 기능. 

를 적용할 때System.Diagnostics.Process 클래스 1은 인스턴스 속성을 사용할 수 있습니다. StandardInput,StandardOutput,그리고.StandardError프로세스의 표준 스트림에 액세스 할 수 있습니다.

2000년-:Python(2~3).

다음 예시는 표준 입력을 표준 출력과 텍스트파일 양쪽으로 리다이렉트 하는 방법을 나타내고 있습니다.

#!/usr/bin/env python 수입품 시스템 # 현재 stdout을 저장하여 sys.stdout을 되돌릴 수 있도록 합니다. # 리다이렉트 완료 후 stdin_fileno = 시스템.스틴 stdout_fileno = 시스템.설치하다 # sys.stdout을 파일로 리다이렉트 합니다. 시스템.설치하다 = 열다.('my file'txt', 'w') CTR = 0 위해서 입력  stdin_fileno:     CTR = 스트레이트(CTR)     # 리다이렉트된 stdout()에 인쇄합니다.     시스템.설치하다.쓰다(CTR + ") 이것은 리다이렉트된 --->" 에 대한 것입니다. + 입력 + '\n')     # 실제 저장된 stdout 핸들러에 인쇄합니다.     stdout_fileno.쓰다(CTR + ") 이것은 실제 --->에 대한 것입니다. + 입력 + '\n')     CTR = CTR + 1 # 파일 닫기 시스템.설치하다.가까운.() # 이전에 저장한 파일 핸들러에 sys.stdout을 복원합니다. 시스템.설치하다 = stdout_fileno 

GUI

그래피컬 유저 인터페이스(GUI)는 표준 스트림을 항상 사용하는 것은 아닙니다.GUI가 Debian 및 Ubuntu로 적절한 명령어를 랩하는 Synaptic 패키지 매니저 GUI와 같은 기본 스크립트 및/또는 콘솔 프로그램의 래퍼일 때 사용합니다.Genity와 KDialog by KDE[10] 프로젝트와 같은 스크립트 도구로 작성된 GUI는 stdin, stdout, stderr를 사용하며, Qt, GTK 또는 기타 동등한 자체 위젯 프레임워크를 사용하여 C/C++로 프로그래밍 및 컴파일된 완전한 GUI가 아닌 단순한 스크립트에 기반합니다.

NextSTEPMac OS X에 구현된 서비스 메뉴도 표준 스트림과 유사합니다.이러한 operating system에서는, 그래피컬·애플리케이션이 시스템 전체의 메뉴로부터 기능을 제공할 수 있습니다.시스템 전체의 메뉴에서는, GUI 의 현재 선택되고 있는 항목에서 동작합니다.어느 애플리케이션에서 동작하든 상관없습니다.

일부 GUI 프로그램(주로 Unix 상)은 디버깅 정보를 표준 에러에 씁니다.많은 Unix 미디어 플레이어와 같은 다른 사용자는 표준 입력에서 파일을 읽을 수 있습니다.GUI 창 외에 별도의 콘솔 창을 여는 일반적인 Windows 프로그램은 에뮬레이터 pSXDOSBox입니다.

GTK 서버는 GUI를 실현하기 위한 인터프리터 프로그램과의 통신 인터페이스로서 stdin을 사용할 수 있습니다.

Common Lisp Interface Manager 패러다임은 확장 출력 스트림으로 전송되는 GUI 요소를 "표시"합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ D. M. Ritchie, "스트림 입출력 시스템", AT&T Bell Laboraties Technical Journal, 68(8), 1984년 10월.
  2. ^ "What are stdin, stdout and stderr in Linux? CodePre.com". 2 December 2021. Retrieved 8 April 2022.
  3. ^ "<unistd.h>". The Open Group Base Specifications Issue 6—IEEE Std 1003.1, 2004 Edition. The Open Group. 2004.
  4. ^ Johnson, Steve (2013-12-11). "[TUHS] Graphic Systems C/A/T phototypesetter" (Mailing list). Archived from the original on 2020-09-25. Retrieved 2020-11-07.
  5. ^ Algorithmic Language Algol 68에 관한 개정 보고서, A. van Wijngaarden, B.J. Mailloux, J.E.L.Peck, C.H.A. Koster, M. Sintzoff, C.H. 린지, L.T.
  6. ^ "Stdin(3): Standard I/O streams - Linux man page".
  7. ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
  8. ^ "System (Java Platform SE 7)". Retrieved 20 July 2012.
  9. ^ "C# Reference Source, .NET Framework 4.7.1, mscorlib, Console class". referencesource.microsoft.com. Retrieved 2017-12-10.
  10. ^ Kißling, Kristian (2009). "Adding graphic elements to your scripts with Zenity and KDialog". Linux Magazine. Retrieved 2021-04-11.

원천

외부 링크