2 minute read

stdio

stdio : History

  • UNIX standard I/O : C언어로부터 유래
    • Dennis Ritchie는 H/W의 입출력 장치가 변경, 추가 되더라도 프로세스의 입출력 부분이 영향 받지 않도록 계층화 해야함을 강조
    • 추상화된 입출력 계층은 장치에 대해 투명성을 제공해야함
    • blok device(저장 장치)나 character device(입출력 장치)는 모두 abstract stream(byte base)로 설계 가능
      • 유닉스 계열의 /dev/*를 오픈할 때 장치에 따라서 추상화된 번호(fd) 부여함
    • 예로, 프로그래머 입장에서 출력 채널의 특징, 예를 들어 터미널 화면의 종류(모니터, 회상도)를 신경 쓸 이유가 없다.
    • 또한 입력 채널의 특징, 예를 들어 키보드의 종류나 제품의 특징에 밎춰서 프로그래밍할 필요도 없어진다.

stdin, stdout, stderr

  • stdio은 세개의 이미 정의된 채널을 가지고 있다.
    • stdin : standard input
    • stdout : standard output
    • stderr : standard err
  • stdio의 implicit file descriptor, fd 값으로 기본으로 다음과 같은 값을 가진다.
    • stdin = 0
    • stdout = 1
    • stderr = 2

redirection

  • stdio의 입출력 방향을 변경
    • 추상화된 장치이므로 논리적으로 연결(open), 해제(close) 등이 가능한다.
      • 예를 들어 stdin은 기본적으로 키보드와 연결되어있지만, 특정 파일에 연결 시키면 자동으로 타이핑되는 효과가 발생한다.
      • stdout은 기본적으로 terminal screen와 연결되어 있지만, 특정 파일에 연결 시키면 자동으로 파일로 저장되는 효과가 발생한다.
    command description
    >FILE 표준출력을 터미널 스크린(default)에서 파일로
    >>FILE 표준출력을 해당 파일에 덧붙이거나 없으면 새 파일로
    <FILE 표준입력을 키보드(default)가 아니라 파일에서 입력
    <<<TEXT 표준입력에 텍스트를 입력
      obo@obo-900X3L:~$ echo hello myname is obo > intro.txt
      obo@obo-900X3L:~$ cat intro.txt 
      hello myname is obo
      obo@obo-900X3L:~$ echo my favorite animal is rabbit >> intro.txt 
      obo@obo-900X3L:~$ cat intro.txt 
      hello myname is obo
      my favorite animal is rabbit
      obo@obo-900X3L:~$ cat <intro.txt 
      hello myname is obo
      my favorite animal is rabbit
      obo@obo-900X3L:~$ cat <<<intro.txt
      intro.txt
    
  • file descriptor

    command description
    <&# 표준입력(stdin)을 파일에서 (&#생략시 0을 의미)
    #> fd #번을 파일로 (# 생략시 1을 의미) (e.g. strace ls -al 2>ls_strace.txt)
    &> stdout, stderr을 파일로
    >&# 출력을 fd #으로
    a | b 리다이렉션 파이프, a의 표준 출력은 b의 표준입력으로 연결됨. |&으로 만들면 stdout, stderr을 결합해서 보낸다.
      obo@obo-900X3L:~$ cat redirection.sh 
      echo "+ Message : stdout"
      echo "+ Message : stderr" >&2
      obo@obo-900X3L:~$ ./redirection.sh > redirection.txt # 첫째행은 txt 파일에 저장. 둘째행은 stderr로 리다이렉션이므로 터미널에 출력
      + Message : stderr
      obo@obo-900X3L:~$ ./redirection.sh 2>&1 | cat > redirection.txt 
      obo@obo-900X3L:~$ ./redirection.sh 2>&1 | tee redirection.txt 
      + Message : stdout
      + Message : stderr
    
  • pipe | command | description | |——-|——-| | >(cmd) | anontmous pipe로 만들어 cmd 명령에 보내여 출력 | | <(cmd) | cmd 명령 결과를 anonymous pipe로 보내어 읽는다. |

    • Here Document
      • symbol 이름을 지정하면 다시 나올때까지 쳤던 입력이 표준 입력으로 들어온다.
      • 문서의 내용이 ftp 프로세스에 전송되어 stdin을 흉내낸다. -n 옵션은 자동 로그인 프롬프팅을 하지 않는 기능
      • sftpscp 요즘 주로 사용
          command <<SYMBOL_NAME
          ... contents
          SYMBOL_NAME
        
  • named PIPE
    • external interface가 있는 경우
    • named PIPE 생성
      • mkfifo /tmp/myfifo_m1

Categories:

Updated: