18.11.2014 Views

System Programming Project 3 - dmclab.hanyang.ac.kr

System Programming Project 3 - dmclab.hanyang.ac.kr

System Programming Project 3 - dmclab.hanyang.ac.kr

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>System</strong> <strong>Programming</strong><br />

<strong>Project</strong> 3<br />

-Signal-<br />

목차 :<br />

1. 개요<br />

2. 실행 과정 및 소스 분석<br />

3. 결과<br />

4. 느낀 점<br />

이름 : 장 형원<br />

학과 : 컴퓨터공학부<br />

학번 : 2011003359<br />

담당교수 : 원 유집<br />

제출일 : 2011.11.06.


1. 개요<br />

이번에 다룰 과제에서는 Signal함수의 올바른 사용법과 사용자만의 Signal을<br />

설정하여 사용자의 신호에 따라 원하는 기능을 다룰 수 있게 해준다.<br />

첫 번째 과제에서는 가로채기 신호(Ctrl+C)로 불리는 SIGINT가 들어올 때<br />

원래 수행되는 함수를 변형시켜 현재 들어온 신호를 출력하고 다시 한 번<br />

Ctrl+C가 눌러졌을 때 제 기능을 하도록 구현하였다.<br />

두 번째 과제에서는 사용자의 SIGNAL인 SIGUSR1 과 SIGUSR2을 설정하<br />

여 각각의 신호가 들어올 때 text.txt 파일을 만들어주거나 현재 경로에 있는<br />

파일들을 출력해주는 ls default기능을 작동하도록 구현하였다.<br />

2. 실행과정<br />

<br />

메인함수에서 signal함수를 설정해준다. signal 함수의 원형은 다음과 같다.<br />

이 함수는 두 가지의 인자를 받는다. 하나는 입력받을 신호인 signo로 정수<br />

형이다. 이것은 헤더파일 signal.h 에 여러 가지가 정의되어 있어 우리는<br />

SIGINT, SIGABRT 등 여러 가지 신호를 써 줄 수 있다. 또 하나의 인자로<br />

반환 값이 void형 인 함수 func이다. 이때 func함수에 전달되는 것이 앞서<br />

인자로 받은 signo값이기도 하다. 사실 이 함수는 쉽게 이해하자면 signo로<br />

받았던 신호가 들어오면 func에 정의되어있는 함수를 실행하겠다는 의미이<br />

다.<br />

메인함수에선 SIGINT 신호가 들어오길 기다리도록 프로세스가 끝나지 않고


pause상태에 놓아주도록 한다. 이때 SIGINT가 들어오면 sigint_handler함수<br />

를 호출한다. Ctrl+C를 한번 치면 sigint_handler가 수행되는 것이다.<br />

sigint_handler함수에서 하는 일은 우선 들어온 신호가 무엇인지 출력하는<br />

것이다. 이 상태에서 한 번 더 SIGINT 신호가 들어오면 SIG_DFL 함수를 호<br />

출하는데 이것은 SIGINT에 이미 지정되었던 함수를 작동하도록 해준다. 따<br />

라서 Ctrl+C를 다시 한 번 치면 그제야 비로소 프로세스가 중단되고 종료되<br />

어 빠져나오게 된다.<br />

<br />

두 번째 과제는 사용자의 신호를 직접 설정하여 받아주는 것이다.<br />

우선 메인함수에서는 사용자 설정의 SIGUSR1과 SIGUSR2 신호들에 대한<br />

signal함수를 선언해줘 이들이 들어오는 것을 대비해준다.<br />

if문 조건문 안을 보면 SIGUSR1 과 SIGUSR2 인 사용자 신호가 들어올 경<br />

우 똑같은 sig_usr함수를 호출하게 된다.


sig_usr함수를 살펴보면 인자로 signo를 받아들이는 것을 볼 수 있다. 이것<br />

은 signal 함수가 메인에서 받아온 신호를 인자값으로 저장한 것이다. 따라<br />

서 이 값을 체크하여 각각의 신호에 따른 다른 작업을 해주도록 설계한 것<br />

이다. 우선 SIGUSR1에 대한 작업은 text.txt라는 텍스트 파일을 만들어 주는<br />

데 creat함수를 사용했으므로 만약 이 파일이 존재한다면 크기를 0으로 줄여<br />

놓는다. 또 접근권한은 모두 읽고 쓰고 사용할 수 있도록 0777로 허용 비트<br />

를 주었다. 이것은 – rwx rwx rwx 로 준 것이다. 만약 파일 생성에 오류가<br />

발생 시 creat함수를 –1을 리턴하므로 에러체크를 해준다.<br />

이번엔 SIGUSR2가 들어올 경우인데, 현재 경로에 있는 파일 중에서 숨김<br />

파일을 제외하고 출력하는 ls default기능을 구현한 것이다. 우선 opendir 함<br />

수에 현재 경로인 “.”를 넣어주어 현재 경로에 대한 dp를 가리키게 해주고,<br />

이것을 readdir함수를 이용하여 읽어서 entry에 넣어준다. entry의 d_name에<br />

는 디렉토리 내에 있는 모든 파일들의 이름이 저장되어 있는데 하나씩 넘어<br />

가면서 맨 첫 번째 글자가 ‘.’ 으로 시작하는 파일은 걸러주고 나머지 파일


들을 출력해준다. 이것은 ‘.’로 시작하는 파일은 숨겨진 파일로 분류되기 때<br />

문이다. 다 출력하고 나면 dp를 닫아준다.<br />

3. 결과<br />

<br />

ex1을 실행시키면 프로세스는 진행 중이다. 이때 Ctrl+C 키를 입력하고 엔터<br />

를 치면 Input 2 signal을 출력하고 이때 숫자 2는 SIGINT에 대한 값이다.<br />

다시 한번 Ctrl+C를 쳐주면 프로세스를 빠져나오고 제 기능을 함을 볼 수<br />

있다.<br />

<br />

우선 ls를 쳐서 현재 경로에 ex1, ex1.c, ex2, ex2.c 총 4가지 파일이 있음<br />

을 확인한다. 이때 ex2를 실행시키는데 &를 붙여주어 프로세스를 배경에서<br />

실행시킨다. 그러면 현재 ex2에 대한 프로세스의 ID가 나타나는데 이것을<br />

우리가 터미널에서 kill 명령을 보낼 때 쓴다. kill –USR1 2250을 치면 2250<br />

프로세스에 유저 signal인 SIGUSR1 신호를 보낸다는 의미이다. 이 결과<br />

test.txt 파일이 생겼다. 이것을 확인하기 위해 SIGUSR2 신호를 보내면 현재<br />

경로에 있는 파일들을 보여주는데 그 결과 test.txt 파일이 추가되었음을 확<br />

인할 수 있다.<br />

4. 느낀 점<br />

signal 함수의 올바른 사용법과 작동 원리를 자세히 알게 되었다. 그리고<br />

이러한 signal 등은 직접 수정이 가능하고 또 사용자만의 신호를 설정하여


만들 수 있다는 점을 배우게 되었다. 이것을 통해 앞으로 신호를 이용한 프<br />

로그램의 메시지 출력, 오류 출력 등에 효율적으로 이용할 수 있을 것이라<br />

생각된다. 시그널 종류는 여러 가지가 있고 그 수가 굉장히 많아 다 외우는<br />

건 무리가 있으나 대게 많이 쓰이는 신호들에 대해서 그리고 시그널들이 어<br />

떻게 사용되는지 정도는 정확히 알아야겠다고 생각한다.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!