1 / 9

프로세스의 정지 : pause

프로세스의 정지 : 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 등의 신호를 수신할 때까지

keola
Download Presentation

프로세스의 정지 : pause

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 프로세스의 정지 : pause 2007242081 유재훈

  2. 목 차 • 1. 예제 7-9의 목적 • 2. pause • 3. alarm • 4. setjmp와 longjmp • 5. 소스 분석

  3. 예제 7-9의 목적 • Alarm과 pause 시스템 호출을 이용 • C라이브러리 sleep(3c)와 같은 기능의 프로그램 • 프로그램의 구현에는 signal과 setjmp, longjmp가 사용

  4. pause • 호출한 프로세스가 SIGALRM 등의 신호를 수신할 때까지 수행 중지 (무시되지 않도록 설정된 신호만 수신) • 프로세스가 신호를 무시하는 경우, pause도 신호를 무시 • 신호 포착 시 해당 인터럽트 처리 루틴 종료 후 pause에서 -1 리턴, errno에 EINTR 설정 (EINTR – 시스템 콜 수행 중 인터럽트로 수행중단 시 발생)

  5. alarm • unsigned int alarm(unsigned int seconds); • alarm 은 seconds 초 후에 프로세스에 SIGALRM 을 전달 • 매개변수 seconds 가 0이라면 SIGALRM 이 전달되지 않음 • alarm 은 이전에 설정된 알람이 시그널을 전달할 때까지 남은 시간을 초 단위 숫자로 반환 • 이전에 설정된 알람이 없을경우 0을리턴

  6. 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 값을 가짐

  7. 소스 설명 • #include <stdio.h.> // 표준 입출력 헤더 • #include <signal.h> // 시그널 사용을 위한 헤더 • #include <setjmp.h> // 비지역 분기 사용을 위한 헤더 • static jmp_buf env; // jmp_buf형 전역변수 env 선언 // (setjmp.h 에 정의됨)

  8. 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() {}

  9. 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을반환값으로 가짐 }

More Related