100 likes | 480 Views
프로세스의 정지 : pause. 2007242081 유재훈. 목 차. 1. 예제 7-9 의 목적 2. pause 3. alarm 4. setjmp 와 longjmp 5. 소스 분석. 예제 7-9 의 목적. Alarm 과 pause 시스템 호출을 이용 C 라이브러리 sleep(3c) 와 같은 기능의 프로그램 프로그램의 구현에는 signal 과 setjmp, longjmp 가 사용. pause. 호출한 프로세스가 SIGALRM 등의 신호를 수신할 때까지
E N D
프로세스의 정지 : pause 2007242081 유재훈
목 차 • 1. 예제 7-9의 목적 • 2. pause • 3. alarm • 4. setjmp와 longjmp • 5. 소스 분석
예제 7-9의 목적 • Alarm과 pause 시스템 호출을 이용 • C라이브러리 sleep(3c)와 같은 기능의 프로그램 • 프로그램의 구현에는 signal과 setjmp, longjmp가 사용
pause • 호출한 프로세스가 SIGALRM 등의 신호를 수신할 때까지 수행 중지 (무시되지 않도록 설정된 신호만 수신) • 프로세스가 신호를 무시하는 경우, pause도 신호를 무시 • 신호 포착 시 해당 인터럽트 처리 루틴 종료 후 pause에서 -1 리턴, errno에 EINTR 설정 (EINTR – 시스템 콜 수행 중 인터럽트로 수행중단 시 발생)
alarm • unsigned int alarm(unsigned int seconds); • alarm 은 seconds 초 후에 프로세스에 SIGALRM 을 전달 • 매개변수 seconds 가 0이라면 SIGALRM 이 전달되지 않음 • alarm 은 이전에 설정된 알람이 시그널을 전달할 때까지 남은 시간을 초 단위 숫자로 반환 • 이전에 설정된 알람이 없을경우 0을리턴
setjmp와 longjmp • setjmp - int setjmp (jmp_buf env); • env에 프로그램의 현재 상태(스택 환경) 저장 • 처음에는 0 을 리턴하지만, 후에 longjmp에 의하여동일한 위치로 리턴할때는 0 이 아닌 값 리턴 • longjmp - void longjmp (jmp_buf env, int val); • setjmp를 호출 • env 변수를 통해 저장된 스택 환경을 복원 • longjmp는 setjmp가 0을 반환하게 할수 없음. • val이 0으로 지정되어 호출되면, setjmp는 1을 반환 • setjmp 의 반환값은 longjmp의 val 값을 가짐
소스 설명 • #include <stdio.h.> // 표준 입출력 헤더 • #include <signal.h> // 시그널 사용을 위한 헤더 • #include <setjmp.h> // 비지역 분기 사용을 위한 헤더 • static jmp_buf env; // jmp_buf형 전역변수 env 선언 // (setjmp.h 에 정의됨)
main(argc,argv) // 메인 함수 int argc; char *argv[]; { int unslept; // int형 변수 unslept 선언 int atoi(); // atoi() 함수 선언 int mysleep(); // mysleep() 함수 선언 void sigint(); // sigint() 함수 선언 signal(SIGINT, sigint); // 인터럽트 수신 대기 // 인터럽트 신호 수신시 sigint에서 처리함 unslept = mysleep(atoi(argv[1])); // mysleep 함수 호출 printf("remaining time: %d\n",unslept); // 인터럽트시 남은시간 출력 } void sigint() {}
mysleep(seconds) // mysleep 함수 int seconds; { void sigcatch(), (*astat)(); // sigcatch, astat 선언 int unslept = seconds; // 설정된 secont 값을 unslept에 대입 astat = signal(SIGALRM, sigcatch); // 알람 신호 수신 대기 // 알람 신호 수신 시, sigcatch에서 처리 if(setjmp(env) == 0) // setjmp가 처음 호출된 경우 { (longjmp에 의해 호출되지 않은 경우) alarm(seconds); // second 초 후 SIGALRM 전달 pause(); // 프로세스 정지 } unslept = alarm(0); // SIGALRM 전달되지 않음 (알람 해제) signal(SIGALRM, astat); // 알람 신호 수신 대기 // (알람 신호 발생시, astat가 처리) return(unslept); // 남은 시간 리턴 } static void sigcatch(sig) int sig; { longjmp(env,1); // 인터럽트 신호 수신 시 setjmp로 설정된 위치로 longjmp // setjmp는 1을반환값으로 가짐 }