본문 바로가기
Program Language/C

signal handler 고찰

by Leo 리오 2011. 6. 3.
반응형
http://forum.falinux.com/zbxe/?mid=C_LIB&listStyle=gallery&page=4&document_srl=408545



설명

자식 프로세스 작업이 끝날 때 까지 대기하며, 자식 프로세스가 종료한 상태를 구합니다.

wait()함수를 실행하면 자식 프로세스가 종료될 때가지 대기하게 됩니다. 만일 자식 프로세스가 정상 종료하여, main()에서 return 으로 값을 반환하거나, 또는 exit()로 값을 반환하며 정상 종료했다면 wait( int *status) 에서 status의 변수 값의 상위 2번째 바이트에 반환 값을 저장합니다.

또는 어떤 시그널에 의해 종료되었다면 최하위 바이트에 시그널 번호가 저장됩니다. 즉,

  8비트 8비트
정상 종료 프로세스 반환 값 0
비정상 종료 0 종료 시킨 시그널 번호
헤더 wait.h
형태 pid_t wait(int *status)
인수 int status 자식 프로세스 종료 상태
반환 pid_t 종료된 자식 프로세스 ID

wait() : 부모 프로세스가 자식 프로세스가 종료했음을 확인하는 함수.
waitpid() : 인자로 프로세스ID를 받음으로써 특정 자식 프로세스의 종료를 기다릴수 있다.

함수원형

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);


※ 자식 프로세스의 상태를 확인하는 매크로들

매크로

세부사항

WIFEXITED(status)

0이 아닌 값을 리턴하면 자식프로세스가 정상종료했다는 뜻이다.

WEXITSTATUS(status)

WIFEXITED(status)매크로를 통하여 자식 프로세스가 정상종료했음을 확인하면 이 매크로를 통하여 종료 코드를 확인할 수 있다. 이 종료 코드는 exit()나 _exit()에서 인자로 주는 값을 말한다. 즉 exit(0)으로 프로그램을 종료했다면 이 0 값이 WIFEXITED 매크로로 알수 있다. 단, 이 매크로는 하위 8비트 값만을 확인하므로 0부터 255까지의 값까지 확인할 수 있다.

WIFSIGNALED(status)

이 매크로가 참이라면 자식 프로세스가 비정상 종료했다는 뜻.

WTERMSIG(status)

SIFSIGNALED(status)매크로가 참일 경우 자식 프로세스를 종료시킨 시그널 번호를 얻는 매크로

WIFSTOPPED(status)

이 매크로가 참이면 자식 프로세스는 현재 멈춰있는(stopped) 상태이다. 다음에서 살펴볼 option인자에 WUNTRACED옵션이 설정되어 있는 경우 자식 프로세스의 멈춤 상태를 알아낼수 있다.

WSTOPSIG(status)

WIFSTOPPED(status)매크로가 참일 경우 자식 프로세스를 멈춤상태로 만든 시그널번호를 얻는다.

WCOREDUMP(status)

시스템에 따라서는 WIFSIGNALED(status)가 참일 경우 자식 프로세스가 core덤프 파일을 생성했는지를 확인하는 이 매크로를 제공해주기도 한다.

※ waitpid()에서 사용하는 pid인자값의 의미

pid의 값

세부사항

pid < -1

pid의 절대값과 동일한 프로세스 그룹ID의 모든 자식 프로세스의 종료를 기다린다.

pid == -1

모든 자식 프로세스의 종료를 기다린다.
만약 pid값이 -1이면 waitpid함수는 wait()함수와 동일하다.

pid == 0

현재 프로세스의 프로세스 그룹ID와 같은 프로세스 그룹ID를 가지는 모든 자식 프로세스의 종료를 기다린다.

pid > 0

pid값에 해당하는 프로세스 ID를 가진 자식 프로세스의 종료를 기다린다.

※ waitpid()에서 사용하는 option인자

인자

인자의 의미

WNOHANG

waitpid()를 실행했을 때, 자식 프로세스가 종료되어 있지 않으면 블록상태가 되지 않고 바로 리턴하게 해준다.

WUNTRACED

pid에 해당하는 자식 프로세스가 멈춤 상태일 경우 그 상태를 리턴한다.
즉 프로세스의 종료뿐 아니라 프로세스의 멈춤상태도 찾아낸다.





시그널 종류

설명

SIGHUP

Hangup을 위한 시그널로 터미널과 시스템 사이에 통신 접속이 끊어졌을 때 터미널에 연결된 프로세스들에게 커널이 보내는 시그널이다.

SIGINT

Interrupt를 위한 시그널로 유저가 인터럽트를 발생시키는 키를 입력했을 때 그와 연결된 프로세스에게 커널이 보내는 시그널이다이 시그널은 프로세스를 종료할 때 많이 사용되는 시그널이다.

SIGQUIT

Quit를 위한 시그널로 유저가 터미널에서 Quit 키를 치면 커널이 프로세스에게 SIGQUIT 시그널을 보낸다.

SIGILL

illegal 명령즉 비정상적인 명령을 수행할 때 OS가 발생시키는 시그널이다.

SIGTRAP

Trace Trap을 위한 시그널로 디버거들이 주로 사용하는 시그널이다.

SIGABRT

Abort 실행시 발생하는 시그널로 Abort는 시스템이 비정상적으로 종료될 때 해당 정보를 남기는 명령이다.

SIGIOT

SIGABRT와 유사한 작업을 수행시 발생하는 시그널이다.

SIGEMT

Emt 명령 실행시 사용되는 시그널이다.

SIGFPE

Floating 포인터 예외사항즉 부동소수점 사용에서 오버플로우나 언더플로우가 발생했을 때 사용되는 시그널이다.

SIGKILL

프로세스가 다른 프로세스를 Kill 시키기 위해 발생하는 시그널이다.

SIGBUS

Bus에러가 발생했을 때 사용되는 시그널이다.

SIGSEGV

메모리 세그먼트 등이 깨졌을 때 발생하는 시그널이다.

SIGSYS

시스템 호출을 할 때 잘못된 인수를 사용하면 발생하는 시그널이다.

SIGPIPE

파이프에서 사용하는 시그널로 아무도 읽지 않는 파이프에 데이터를 출력할 때 발생하는 시그널이다.

SIGALRM

알람 클락 시그널로 해당 타이머가 끝나면 발생되는 시그널이다.

SIGTERM

kill에 의해 프로세스가 종료할 때 발생되는 시그널이다.





반응형

'Program Language > C' 카테고리의 다른 글

format not a string literal and no format arguments  (0) 2011.11.11
The Context Free Grammar Checker  (0) 2011.10.12
fopen 과 fscanf로 읽어들이기  (0) 2011.05.31
exec함수 군  (0) 2011.04.19
freopen  (0) 2011.03.31

댓글