2014년 12월 3일 수요일

Unix programming _ #1. 특수문자의 특수성 제거하기

이번 게시물 부터는 unix서버를 이용하여 작은 쉘을 만들고 기본적인 기능을 추가해보도록 하겠습니다.
앞으로의 계획을 목차로 설명해보도록 합니다.
1. 유닉스 프로그래밍 문법상 특수성을 가진 특수문자의 특수성 제거
2. 해쉬문자 (#)가 나오면 이후의 내용을 주석으로 인식하라.
3. dup2( ) 함수를 이용하여  파일의 표준 입출력 방향을 전환하라. (>, <. >>, <<을 지원하도록 기능 구현)
4. 인터럽트를 처리할 수 있도록 개조하라. SIGINT, SIGQUIT에 의해서 정지되지 않도록 하라.
5. 파이프를 처리할 수 있도록 개조하라. ex>ls | more 에 의해서 ls(현재 프로세스 내의 파일 목록을 출력)결과를 more(한 화면 크기에 맞추어 출력)의 명령대로 한 화면에 나타낼 수 있을만큼 출력

오늘은 첫 번째 기능인 특수문자의 특수성 제거 기능을 구현해 보도록 하겠습니다. 유닉스에서는 특수문자앞에 '\'를 붙여 바로 다음에 오는 특수문자의 특수성을 제거하는 기능을 제공합니다. 다시 말하면 '\'은 특수문자의 특수성을 제거하는 특수한 기능을 갖는 특수문자인 것이죠. 일단 작은 쉘의 구성부터 알아보고 특수문자의 특수성을 제거하는 구문을 추가시키도록 합니다.

작은 쉘(small shell)을 구성하는 파일 목록은 다음과 같습니다.
Makefile
procline.c
runcommand.c
smallsh.h
smallsh.c
userin.c
일단 smallsh.c파일이 어떻게 구성되는 지 살펴보도록 하겠습니다.

  • smallsh.c파일

Char형 포인터로 선언된 1차원 포인터 변수 prompt에는 문자열이 저장됩니다. 이 문자열은 main함수 안의 while문에서 userin()함수에 매개변수로 전달되어 procline()함수의 수행 조건으로 사용되고 있습니다. userin()함수를 살펴봅시다 

  • userin.c()

8행에서 보듯이 userin의 매개변수는 char형 포인터 변수입니다.
똑같이 char형 1차원 포인터 변수로 선언된 ptr, tok에는 char형 배열로 선언된 inpbuf, tokbuf의 값이 넘겨집니다. inpbuf와 tokbuf의 배열 크기는 MAXBUF, MAXBUF*2로 smallsh.h파일에 define되어 있기는 MAXBUF는 256입니다.
그리고 17행에서는 입력으로 받은 char형 포인터 p를 %s를 통해 문자열 형태로 출력합니다.

19행에서는 10행에서 선언한 int형 변수 count를 0으로 초기화합니다.

21행에서부터는 while(1)에 의해 반복문이 실행됩니다.

10행에서 count와 함께 선언된 int형 변수 c에는 getchar의 반환값으로 stdin으로 입력받은 문자열이 버퍼에 저장되었다가 반환되어 c에 저장된다. getchar에 대하여 잠깐 짚고 넘어가보자.
getchar()함수-------------------------------------------------------
사용자에게 '한 문자'입력을 받는 함수이다. 과정이 화면에 표시되며, 입력받은 데이터는 조료인식 '\n'이 있기전까지 버퍼에 담긴다. 읽어들인 문자를 int 값으로 리턴한다. 읽기 오류가 발생하거나 파일 끝에 도달하면 EOF를 리턴한다. 
-----------------------------------------------------------------
어쨌든 사용자로부터 한 문자씩 입력 받아 입력받은 문자를 int형으로 리턴하는 함수에 파일 끝을 알리는 '\n'이 입력되어 EOF가 반환되면 if문의 조건문이 실행된다. EOF가 반환됩니다. userin()의 반환값이 EOF가 되면 main함수의 while문 안의 조건문이 0이므로 while문이 실행되지 않습니다. 즉, EOF가 반환되기 직전까지 main함수는 procline()함수를 호출하게 됩니다.



댓글 없음:

댓글 쓰기