운영체제에서 주어진 일을 하는 최소단위는 프로세스라는 것을 알고 있을 것이다. 프로세스는 프로그램의 실행된 이미지로 운영체제의 메인메모리에 위치한다.

이렇게 프로그램이 실행되어서, 프로세스가 생성되면 프로세스는 컴퓨터의 여러가지 기본자원을 사용할 수 있게 된다. 이 기본자원에 3개의 파일이 포함되어 있다. 바로 입력출력, 에러를 담당하는 3개의 파일들이다. 이것들을 표준입력, 표준출력, 표준에러라고 한다.

  • 표준입력 : 키보드로 부터 입력을 받기 위해서 사용한다.
  • 표준출력 : 모니터로 출력하기 위해서 사용된다.
  • 표준에러 : 에러도 역시 모니터를 통해서 출력된다는 점에서는 표준출력과 마찬가지다. 그러나 어떠한 구분도 없다면, 화면에 출력된 값이 정상적으로 처리된 메시지인지, 에러메시지 인지 확인할 수 없을 것이다. 때문에 표준에러라는 것을 따로 둬서 구분할 수 있게끔하고 있다.

이들 표준입/출력/에러 역시 파일의 형태로 다루어지며, 운영체제는 이를 위해서 예약된 숫자를 파일지시자로 할당한다. 표준입력은 0, 표준출력은 1, 표준에러는 2로 예약되어 있다.

간단한 예를 들어서 설명해보도록 하겠다.
#include <unistd.h> 
#include <string.h>

int main(int argc, char **argv)
{
char data[80];
char *msg = "Input Msg : ";
memset(data, 0x00, 80);

write(1, msg, strlen(msg)); // 1

read(0, data, 80); // 2
write(1, data, strlen(data)); // 3
write(2, "Error\n", 6); // 4
}
  1. "Input Msg"메시지를 모니터에 표준출력 한다.
  2. 표준입력을 통해서 데이터를 읽어들인다. 읽어들인 데이터는 data 에 복사한다.
  3. data에 복사된 내용을 data의 길이 만큼 모니터에 표준출력 한다.
  4. Error라는 메시지를 모니터에 표준에러형태로 출력한다.
이 프로그램을 실행시키면 다음과 같은 결과를 확인할 수 있을 것이다.
# ./write 
Input Msg : hello world
hello world
Error
  • write(2)
    이 함수는 파일지시자(첫번째 인자)가 가리키는 파일에 "쓰기" 위해서 사용한다.
  • read(2)
    이 함수는 파일지시자가 가리키는 파일에서 데이터를 "읽기" 위해서 사용한다.

표준입력과 표준출력을 이해하는데에는 별 어려움이 없을 것이다. 그럼 표준에러와 표준출력을 어떻게 구분할 수 있느냐 하는 문제가 남는다.

표준에러는 쉘의 재지향을 이용해서 따로 분리해서 읽을 수 있다. 재지향은 >을 쓰면 된다. - 2장 리눅스와 C언어참고 - 또한 2>와 같이 표준에러만을 분리해서 재지향 시킬 수가 있다. 여기에서 2가 바로 표준출력을 가리키는 파일지시자 번호다. 이제 다음과 같이 표준에러만 별도의 파일에 재지향 시켜보도록 하자.
# ./write 2> dump.log 
Input Msg : hello world
hello world
# cat dump.log
Error
표준에러가 모니터 화면이 아닌, dump.log 파일에 저장된걸 확인할 수 있을 것이다. 이로써, 표준에러와 표준출력이 모니터를 출력방향으로 하고 있지만, 명백히 구분되는 것임을 이해했을 것이다.

출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/C/Documents/CprogramingForLinuxEnv/Ch13_Input_Output

'It's IT > It's System(linux,win)' 카테고리의 다른 글

Linux 공부를 함 해볼까??????  (0) 2019.12.24
linux, unix shell script 조건문에서 사용하는 기호  (0) 2008.01.17
퍼미션, CHMODE  (0) 2007.12.14
VI명령어  (0) 2007.12.14
PING  (0) 2007.12.14

+ Recent posts