맨위로가기

표준 스트림

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

표준 스트림은 유닉스 운영 체제에서 시작된 개념으로, 프로그램이 입출력 장치를 일일이 연결할 필요 없이 순차적인 데이터 흐름을 처리할 수 있도록 하는 방식이다. 유닉스 이전 운영체제의 복잡성을 해결하기 위해 데이터 스트림과 자동 연결 입출력 장치를 제공했으며, 이후 C 언어를 비롯한 다양한 프로그래밍 언어에서 표준 스트림을 지원하게 되었다. 표준 스트림은 표준 입력(stdin), 표준 출력(stdout), 표준 오류(stderr)로 구성되며, 파이프라인과 리다이렉션을 통해 프로그램 간의 데이터 흐름을 제어하는 데 사용된다. GUI 환경에서는 표준 스트림을 직접적으로 사용하지 않는 경우가 많지만, 일부 프로그램에서는 디버그 정보 출력이나 파일 입력을 위해 활용되기도 한다.

더 읽어볼만한 페이지

  • C 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • C 프로그래밍 언어 - 헤더 파일
    헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다.
  • 유닉스 - 유닉스 시간
    유닉스 시간은 1970년 1월 1일 00:00:00 UTC부터 경과된 초를 나타내는 시스템으로, 컴퓨터 시스템에서 시간 저장 및 처리에 널리 사용되며 32비트 정수 표현 시 2038년 문제를 야기할 수 있고 64비트 정수로 해결 가능하며, 다양한 시스템에서 타임스탬프로 활용되지만 윤초 처리 차이로 UTC 시간과 완벽히 일치하지는 않는다.
  • 유닉스 - 유닉스 계열
    유닉스 계열은 유닉스 운영체제의 특징과 설계를 공유하는 운영체제들을 지칭하며, 유전적, 상표, 기능적 유닉스로 분류되고 macOS는 상표 유닉스이자 유전적 유닉스에 해당하며 리눅스는 기능적 유닉스의 대표적인 예이다.
표준 스트림
표준 스트림
종류표준 입력 (stdin)
표준 출력 (stdout)
표준 에러 (stderr)
설명
표준 입력프로그램에 데이터를 공급하는 입력 스트림
표준 출력프로그램이 결과를 출력하는 출력 스트림
표준 에러프로그램의 오류 메시지를 출력하는 출력 스트림
파일 설명자
표준 입력0
표준 출력1
표준 에러2
C 언어
표준 입력stdin
표준 출력stdout
표준 에러stderr
POSIX 셸
표준 입력0<&0
표준 출력1>&1
표준 에러2>&2

2. 역사적 배경

표준 스트림의 개념은 유닉스 운영 체제에서 비롯되었으며, 프로그램과 장치 간의 상호 작용을 단순화하고 추상화하는데 크게 기여했다.[1] 유닉스에서 표준 스트림이 지원된 이후, C 실행 환경에서도 이를 지원해야 했다. 그 결과, 대부분의 C 실행 환경(이후 C의 파생 언어들을 포함)에서 운영 체제와 상관없이 동일한 기능을 제공하게 되었다.[1]

2. 1. 유닉스 이전의 운영 체제

유닉스 이전의 대부분의 운영 체제에서, 프로그램은 명시적으로 적절한 입력 장치와 출력 장치에 연결해줄 필요가 있었다. 이 작업은 각 운영 체제(OS)마다 처리 방식이 달랐기 때문에 매우 방대한 작업이었다. 수많은 시스템에서 환경 설정을 제어하거나, 파일 테이블에 접근하거나, 필요한 데이터 셋을 결정하기 위해 천공 카드 리더, 자기 테이프 드라이브, 디스크 드라이브, 라인 프린터, 카드 펀치, 대화식 터미널을 적절하게 제어할 필요가 있었다.[1]

이런 상황에서, 유닉스는 '''장치의 추상화'''라는 획기적인 발전을 이루었다. 프로그램은 더 이상 어떤 장치와 연결되는지 알 필요가 없었다. 유닉스는 기존의 복잡성을 '''데이터 스트림'''이라는 개념으로 해소시켰다. 데이터 스트림은 순차적인 데이터 바이트들을 파일 끝까지 읽는다. 이런 방식으로, 프로그램은 쓸 데이터가 얼만큼 남았는지, 혹은 어떤 식으로 묶여있는지 알 필요 없이 필요한 데이터를 쓸 수 있었다.[1]

또 다른 유닉스의 획기적인 발전은, '''자동으로 연결되는 입출력 장치'''였다. 프로그래머나 프로그램에서 입출력을 사용해야 할 때, 입출력 장치를 연결하기 위한 그 어떤 추가 작업도 필요하지 않게 되었다. 이전의 운영 체제들에서 입출력 장치를 연결하기 위해 복잡한 작업 제어 언어가 필요하거나, 그와 동일한 역할을 하는 프로그램이 필요했던 것과는 대조적이다.[1]

2. 2. 유닉스의 발전

유닉스 이전의 대부분의 운영 체제에서, 프로그램은 명시적으로 적절한 입력 장치와 출력 장치에 연결해야 했다. 이 작업은 각 OS마다 처리 방식이 달랐기 때문에 매우 방대한 작업이었다. 수많은 시스템에서 환경 설정을 제어하거나, 파일 테이블에 접근하거나, 필요한 데이터 셋을 결정하기 위해 천공 카드 리더, 자기 테이프 드라이브, 디스크 드라이브, 라인 프린터, 카드 펀치, 대화식 터미널을 적절하게 제어할 필요가 있었다.

이런 상황에서, 유닉스의 획기적인 발전 중 하나는 '''장치의 추상화'''였다. 프로그램은 더 이상 어떤 장치와 연결되는지 알 필요가 없었다. 유닉스는 기존의 복잡성을 '''데이터 스트림'''이라는 개념으로 해소했다. 데이터 스트림은 순차적인 데이터 바이트들을 파일의 끝(EOF)까지 읽는다. 이런 방식으로, 프로그램은 쓸 데이터가 얼마큼 남았는지, 혹은 어떤 식으로 묶여 있는지 알 필요 없이 필요한 데이터를 쓸 수 있었다.

또 다른 유닉스의 획기적인 발전은, '''자동으로 연결되는 입출력 장치'''였다. 프로그래머나 프로그램에서 입출력을 사용해야 할 때, 입출력 장치를 연결하기 위한 그 어떤 추가 작업도 필요하지 않게 되었다. 이전의 운영 체제들에서 입출력 장치를 연결하기 위해 복잡한 작업 제어 언어가 필요하거나, 그와 동일한 역할을 하는 프로그램이 필요했던 것과는 대조적이다.

유닉스에서 표준 스트림이 지원된 이후로, 유닉스 C 실행 환경에서도 이를 잘 지원해야 할 의무가 생겼다. 그 결과, 대부분의 C 실행 환경에서 (이후의 C의 파생 언어들을 포함하여) 운영 체제와 상관없이 동일한 기능을 제공하게 되었다.

2. 3. 프로그래밍 언어의 발전

유닉스 이후 C 언어, C++, 자바, .NET, 파이썬 등 다양한 프로그래밍 언어에서 표준 스트림을 지원하게 되었다.

  • '''C 언어''': 유닉스의 영향을 받아 표준 스트림(stdin, stdout, stderr)을 지원하며, 이는 유닉스 파일 디스크립터 0, 1, 2에 각각 대응한다.
  • '''FORTRAN''': 유닉스 파일 디스크립터와 유사한 기능을 제공한다. 표준 입력(stdin)은 `UNIT=5`, 표준 출력(stdout)은 `UNIT=6`, 표준 에러(stderr)는 `UNIT=0`으로 표현한다. 포트란-2003에서는 `ISO_FORTRAN_ENV` 모듈을 통해 이식성을 높였다.
  • '''ALGOL 60''': 표준 스트림(파일 접근) 개념이 존재하지 않는다.
  • '''ALGOL 68''': 입출력을 transput이라 부르며, `stand in`, `stand out`, `stand error`, `stand back`을 포함하는 표준을 정의했다.
  • '''자바''': `System.in`(stdin), `System.out`(stdout), `System.err`(stderr)로 표준 스트림을 참조한다.[8]
  • '''C#''' 및 기타 .NET 언어: `System.Console.In`(stdin), `System.Console.Out`(stdout), `System.Console.Error`(stderr)로 표준 스트림을 참조한다.[9] `System.IO.TextReader`, `System.IO.TextWriter` 객체를 통해 텍스트 기반 접근이 가능하며, `System.IO.Stream` 객체를 통해 바이너리 접근이 가능하다.


주요 프로그래밍 언어별 표준 스트림 지원 방식
언어표준 입력 (stdin)표준 출력 (stdout)표준 에러 (stderr)비고
C 언어`stdin``stdout``stderr`유닉스 파일 디스크립터 0, 1, 2에 대응
FORTRAN`UNIT=5``UNIT=6``UNIT=0`포트란-2003부터 `ISO_FORTRAN_ENV` 모듈 사용
ALGOL 60해당 없음해당 없음해당 없음표준 스트림 개념 없음
ALGOL 68`stand in``stand out``stand error`입출력을 `transput`으로 통칭
자바`System.in``System.out``System.err`
C#`System.Console.In``System.Console.Out``System.Console.Error`


3. 표준 입력 (stdin)

'''표준 입력'''(standard input|스탠더드 인풋영어, '''stdin''')은 프로그램으로 들어가는 데이터 (주로 문자열) 스트림이다. 프로그램은 `read` 명령을 이용하여 데이터 전송을 요청한다. 모든 프로그램이 입력을 요구하는 것은 아니다. 예를 들어 dir이나 ls 프로그램 (디렉터리에 들어 있는 파일 이름을 보여 주는 명령)은 실행 시 옵션과 같은 명령줄 매개변수를 받을 수는 있지만, 동작 중에 데이터 스트림의 입력 없이 명령을 수행한다.

별도의 리다이렉션 없이 프로그램을 시작한 경우, 표준 입력 스트림은 키보드에서 받아온다.

표준 입력을 위한 파일 서술자는 0이다. POSIX `<unistd.h>` 정의는 STDIN_FILENO이다. 이에 해당하는 <stdio.h> 변수는 `FILE* stdin;`이다. 이와 비슷하게 <iostream>에서는 std::cin이다.

4. 표준 출력 (stdout)

표준 출력(standard output|스탠더드 아웃풋영어, stdout)은 프로그램이 내보내는 데이터 스트림이다. 프로그램은 `write` 연산을 사용하여 데이터 전송을 요청한다. 모든 프로그램이 출력을 요구하는 것은 아니다. 예를 들어 파일 이름 변경 명령어(`mv`, `move`, `ren` 등)는 아무것도 출력하지 않는다.[1]

이 스트림의 기본 대상은 프로그램을 실행한 터미널의 디스플레이이다. 리다이렉션을 통해 쉽게 대상을 변경할 수 있다.[1]

표준 출력의 파일 디스크립터는 1이다. POSIX의 `<unistd.h>`에서는 `STDOUT_FILENO`로 정의되어 있다. 해당되는 `<stdio.h>`의 변수는 `FILE* stdout`, `<iostream>`의 변수는 `std::cout`이다.[1]

5. 표준 오류 (stderr)

표준 오류(standard error, stderr)는 프로그램이 오류 메시지나 진단 메시지를 출력하는 데 사용되는 또 다른 출력 스트림이다. 표준 출력과는 독립적인 스트림으로, 별도로 리디렉션할 수 있다.[2]

표준 오류의 파일 서술자는 2이다. POSIX의 `<unistd.h>`에서는 `STDERR_FILENO`로 정의되어 있으며, `<stdio.h>`에서는 `FILE* stderr` 변수로, `<iostream>`에서는 `std::cerr`과 `std::clog` 변수로 제공된다. `std::cerr`은 버퍼링되지 않지만, `std::clog`는 버퍼링을 사용한다.[3]

표준 출력과 표준 에러는 기본적으로 터미널로 지정되어, 표준 출력이 리디렉션되어도 오류 메시지는 사용자가 볼 수 있다. 예를 들어, 파이프를 통해 출력이 다른 프로그램으로 전달될 때도, 오류 메시지는 터미널에 그대로 표시된다.

표준 출력과 표준 에러를 같은 대상으로 리디렉션하는 것도 가능하다. 버퍼가 없을 때는 프로그램이 작성한 순서대로 메시지가 나타나지만, 표준 에러는 보통 버퍼링되지 않고 표준 출력은 행 단위로 버퍼링되므로, 표준 에러에 늦게 쓰여진 텍스트가 먼저 표시될 수도 있다.

본 쉘에서는 `2>&1`을 사용하여 표준 에러를 표준 출력과 같은 대상으로 리디렉션할 수 있으며, C 쉘에서는 `>&`를 사용한다.

6. 응용 프로그램

표준 스트림은 응용 프로그램 간의 연쇄적인 연결에 사용될 수 있다. 예를 들어, 어떤 프로그램의 출력은 다른 프로그램의 입력으로 쓰일 수 있는데, 잘 알려진 예로는 `pager`나 `more` 유틸리티가 있다. 사용자는 이를 통해 다른 응용 프로그램의 출력 스트림을 제어하여 화면에 어떻게 표시할지 결정할 수 있다.[5]

텍스트 터미널 상에서 동작하는 세 개의 프로그램이 파이프라인으로 연결된 모습


표준 스트림은 텍스트 처리뿐만 아니라 이진 데이터 전송에도 사용될 수 있다.[5]

206x206px

6. 1. 파이프라인

한 프로그램의 출력을 다른 프로그램의 입력으로 연결하는 기능은 `|` (수직 막대 문자)를 사용하여 표현하며, 이러한 이유로 종종 파이프라인 문자라고 불린다. 많은 운영 체제에서 이는 응용 프로그램 이름을 수직 막대 문자로 구분하여 나열하는 방식으로 표현된다. 잘 알려진 예시는 더 보기와 같은 페이지 매김 응용 프로그램을 사용하여 사용자에게 디스플레이의 출력 스트림 표시를 제어하는 것이다.[6]

켄 톰슨(초기 유닉스 운영 체제의 설계자이자 구현자)은 유닉스 버전 5에서 sort가 표준 입력을 나타내는 "-"를 허용하도록 수정하였고, 이는 다른 유틸리티로 확산되어 유닉스 버전 8에서 특수 파일의 일부가 되었다. 데니스 리치는 유닉스 버전 6까지 표준 출력의 일부였던 진단을 표준 오류 개념으로 만들었다.[7]

6. 2. 리다이렉션

표준 스트림의 입출력 방향을 변경하는 기능이다. 쉘에서 `<` (표준 입력), `>` (표준 출력), `2>` (표준 오류) 등의 기호를 사용하여 제어한다.

별도의 리다이렉션 없이 프로그램을 시작한 경우, 표준 입력 스트림은 키보드에서 받아오고, 표준 출력은 프로그램을 시작한 텍스트 터미널로 출력된다. 표준 오류는 표준 출력과는 독립적인 스트림이며 별도로 리다이렉트될 수 있다.

다음은 파이썬으로 작성된 예시로, 표준 입력을 표준 출력과 텍스트 파일로 리디렉션하는 방법을 보여준다.

```python

#!/usr/bin/env python

import sys

# 리디렉션을 완료한 후 sys.stdout을 되돌릴 수 있도록 현재 stdout을 저장합니다.

stdin_fileno = sys.stdin

stdout_fileno = sys.stdout

# sys.stdout을 파일로 리디렉션합니다.

sys.stdout = open("myfile.txt", "w")

ctr = 0

for inps in stdin_fileno:

ctrs = str(ctr)

# 리디렉션된 stdout에 출력합니다.

sys.stdout.write(ctrs + ") this is to the redirected --->" + inps + "\n")

# 실제 저장된 stdout 핸들러에 출력합니다.

stdout_fileno.write(ctrs + ") this is to the actual --->" + inps + "\n")

ctr = ctr + 1

# 파일을 닫습니다.

sys.stdout.close()

# sys.stdout을 이전의 저장된 파일 핸들러로 복원합니다.

sys.stdout = stdout_fileno

7. GUI 환경에서의 표준 스트림

그래픽 사용자 인터페이스(GUI) 환경에서는 표준 스트림을 거의 사용하지 않는다. GUI 프로그램을 리다이렉션하거나 GUI 프로그램에서 파이프를 사용하는 일은 없다. GUI에서 표준 스트림과 비슷한 역할을 하는 것은 복사 및 붙여넣기이다. 그러나 사용자가 직접 조작해야 하므로 여러 번 "붙여넣기"를 하는 것은 효율적이지 않다.

예외적으로, dwm이라는 타일링 윈도우 매니저는 표준 출력(stdout)에 있는 데이터를 상태 표시줄에 직접 표시한다.

유닉스 계열의 일부 GUI 프로그램은 디버그 정보를 표준 오류 출력에 기록하기도 한다. 또한, 표준 입력을 통해 파일을 읽도록 만들어진 프로그램도 있는데, 유닉스 계열의 미디어 플레이어에서 흔히 볼 수 있다. 에뮬레이터 pSX 및 DOSBox와 같이 GUI 창 외에 별도의 콘솔 창을 여는 Windows 프로그램도 존재한다.[10]

참조

[1] 간행물 A Stream Input-Output System https://cseweb.ucsd.[...] AT&T Bell Laboratories Technical Journal 1984-10
[2] 웹사이트 What are stdin, stdout and stderr in Linux? https://codepre.com/[...] 2022-04-08
[3] 웹사이트 "" http://pubs.opengrou[...] The Open Group
[4] 메일링리스트 "[TUHS] Graphic Systems C/A/T phototypesetter" https://minnie.tuhs.[...] 2020-11-07
[5] 문서 Revised Report on the Algorithmic Language Algol 68 http://www.softwarep[...]
[6] 웹사이트 Stdin(3): Standard I/O streams - Linux man page http://linux.die.net[...]
[7] Tech Report A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 http://www.cs.dartmo[...] 1987
[8] 웹사이트 System (Java Platform SE 7) http://docs.oracle.c[...] 2012-07-20
[9] 웹사이트 ".NET Framework 4.7.1, mscorlib, console.cs" https://referencesou[...] 2017-12-10
[10] 웹사이트 Adding graphic elements to your scripts with Zenity and KDialog https://www.linux-ma[...] 2021-04-11
[11] 간행물 A Stream Input-Output System https://cseweb.ucsd.[...] AT&T Bell Laboratories Technical Journal 1984-10
[12] 문서 3.7.3 Command Execution Environment https://www.gnu.org/[...] GNU Bash Reference Manual
[13] 문서 unistd.h http://pubs.opengrou[...] The Single UNIX ® Specification, Version 2
[14] 문서 12.2 Standard Streams http://www.gnu.org/s[...] The GNU C Library
[15] 문서 11.1.1 Streams and File Descriptors http://www.gnu.org/s[...] The GNU C Library
[16] 문서 LINUX ALLOCATED DEVICES (2.6+ version) - Compulsory links https://www.kernel.o[...] 2009-04-06



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com