본 강의에 들어가기 전

Similar documents
1장. 유닉스 시스템 프로그래밍 개요

<4D F736F F F696E74202D BDC3B1D7B3CEB0FA20BDC3B1D7B3CE20C3B3B8AE2E707074>

2009년 상반기 사업계획

Microsoft PowerPoint - ch07_시그널 [호환 모드]

Microsoft PowerPoint - 10_Signal

제1장 Unix란 무엇인가?

Chap04(Signals and Sessions).PDF

슬라이드 1

Microsoft PowerPoint - SP6장-시그널.ppt [호환 모드]

좀비프로세스 2

/chroot/lib/ /chroot/etc/

K&R2 Reference Manual 번역본

ABC 11장

System Programming Lab

Chapter #01 Subject

The Pocket Guide to TCP/IP Sockets: C Version

슬라이드 1

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

untitled

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Microsoft PowerPoint - chap10-함수의활용.pptx

본 강의에 들어가기 전

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

제1장 Unix란 무엇인가?

untitled

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

<4D F736F F F696E74202D FC7C1B7CEBCBCBDBA20BBFDBCBAB0FA20BDC7C7E0205BC8A3C8AF20B8F0B5E55D>

2009년 상반기 사업계획

Microsoft PowerPoint - chap11-포인터의활용.pptx

2009년 상반기 사업계획

untitled

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

PowerPoint 프레젠테이션

chap 5: Trees

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 4 가지중하나. (1) 프로그램수행직후, (2) kill 명령실행직후, (3) 15 #include <signal.

Microsoft PowerPoint - 09-Pipe

제1장 Unix란 무엇인가?

리눅스 프로세스 관리

PowerPoint 프레젠테이션

금오공대 컴퓨터공학전공 강의자료

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - chap03-변수와데이터형.pptx

<C1A63130C0E5C7C1B7CEBCBCBDBA2E687770>

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Lab 3. 실습문제 (Single linked list)_해답.hwp

chap7.key

제12장 파일 입출력

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Microsoft PowerPoint - 10_Process

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

6주차.key

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - chap05-제어문.pptx

11장 포인터

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint 프레젠테이션


Microsoft PowerPoint - chap12-고급기능.pptx

03장.스택.key

C 언어 프로그래밊 과제 풀이

기술문서 LD_PRELOAD 와공유라이브러리를사용한 libc 함수후킹 정지훈

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

vi 사용법

윤성우의 열혈 TCP/IP 소켓 프로그래밍

chap12(process).hwp

제1장 Unix란 무엇인가?

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerPoint 프레젠테이션

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

10.

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

고급 IPC 설비

untitled

PowerPoint 프레젠테이션

중간고사

5.스택(강의자료).key

Microsoft PowerPoint - ch09_파이프 [호환 모드]

2009년 상반기 사업계획

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

슬라이드 1

Frama-C/JESSIS 사용법 소개

C 프로그래밊 개요


UI TASK & KEY EVENT

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

untitled

슬라이드 1

Chapter 4. LISTS

chap8.PDF

ch15

제9장 프로세스 제어

슬라이드 1

C 프로그래밊 개요

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap06-5 [호환 모드]

PowerPoint 프레젠테이션

Transcription:

유닉스프로그래밍및실습 9 장. 시그널

1. 시그널개념 시그널생명주기 시그널이발생한다. 커널이해당시그널을쌓아둔다.( 동일한시그널이오는경우하나만 ) 가능한시점에서커널이적절하게처리한다 커널의처리방법 시그널무시 아무런동작을하지않는다 절대무시할수없는시그널 SIGKILL SIGSTOP 시그널을붙잡아처리 현재코드경로를따라가는실행을중단하고, 시그널마다등록된함수로점프 기본동작 대부분프로세스종료 일부는무시 시그널식별자 SIG로시작하는상징적이름 <signal.h> 에서정의 p.392 ~ p.397 시그널이름과특징확인

2. 기초적인시그널관리 (1) signal() 함수 typedef void (*sighandler_t)(int); sighandler_t signal(int signo, sighandler_t handler); signal() 이성공하면시그널을받았을때수행할현재처리기를제거하고, 대신 handler 로명시된처리기등록 handler() 예 void my_handler(int signo); 현재시그널을무시하거나, 기본값을수행하도록지정할수도있음 SIG_DFL SIG_IGN 모든시그널기다리기 #include <unistd.h> int pause(void); 프로세스를잠들게한후붙잡을수있는시그널이오면깨어남

2. 기초적인시그널관리 (2) 예제 (p.400, p.401) 실행과상속 exec() 수행시새로만들어진프로세스는시그널에대해각각기본동작으로설정 부모가이를무시하도록설정한경우에만그대로상속 fork() 는부모, 자식이주소공간을공유하므로동일한시그널설정상속 시그널번호를문자열에사상하기 정적문자열검색방법 ( 가장최선 ) extern const char * const sys_signal[]; BSD 계열 psignal() 비표준 - strsignal()

3. 시그널보내기 kill pid 0 인경우호출한프로세스가속한프로세스그룹전체에게 pid -1 인경우호출한프로세스가시그널을보낼권한이있는모든프로세스에게 pid -1 보다작은경우프로세스그룹 pid 에속한모든프로세스에게 권한 CAP_KILL 예제 p.406 #include <sys/types.h> int kill(pid_t pid, int signo); 자신에게시그널보내기 int raise(int signo); 프로세스그룹전체에게보내기 int killpg (int pgrp, int signo);

4. 재진입가능성 시그널처리기는관련프로세스가중단되었을때무엇을하고있었는지에대한어떤가정도하지않아야한다. 전역자료를절대손대지않는정책이바람직 일부는재진입불가능 재진입가능함수는정적자료를조작해서는안되며, 스택에할당된자료나호출한쪽에서제공한자료만조작해야한다. 재진입보장함수 p. 409 표 9-2

5. 시그널집합 시그널차단과같은기능은시그널들의집합을대상으로함 시그널집합을관리하는함수필요 int sigempty(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signo); int sigdelset(sigset_t *set, int signo); int sigismember(const sigset_t *set, int signo); 추가적인시그널집합함수 #define _GNU_SOURCE int sigisempty(sigset_t *set); int sigorset(sigset_t *dest, sigset_t *left, sigset_t *right); int sigandset(sigset_t *dest, sigset_t *left, sigset_t *right); 리눅스의비표준함수

6. 시그널차단하기 임계영역 (critical section) 일시적인시그널차단 (blocking) 시그널마스크관리함수 int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); SIG_SETMASK SIG_BLOCK SIG_UNBLOCK 대기중인시그널조회하기 int sigpending(sigset_t *set); 일군의시그널기다리기 int sigsuspend(const sigset_t *set);

7. 고급시그널관리 sigaction int sigaction(int signo, const struct sigaction *act, struct sigaction *oldact); struct sigaction { void (*sa_handler)(int); /* 시그널처리기혹은동작 */ void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; /* 차단할시그널 */ int sa_flags; /* 플래그 */ void (*sa_restorer)(void); /* 폐기 */ }; 플래그 sa_flags 에 SA_SIGINFO 를설정하면 sa-sigaction 에함수명시 void my_handler(int signo, siginfo_t *si, void *ucontext); sa_flags 값 (p.416) siginfo_t 구조체 (p.417) si_code (p.419)

8. 페이로드와더불어시그널보내기 페이로드와같이보내기 int sigqueue(pid_t pid, int signo, const union sigval value); union sigval { int sival_int; void * sival_ptr; }; 예제 (p.423)

과제 주문 / 서빙프로세스 반복적으로사용자의주문을받아주방프로세스에게전달 주방프로세스에서요리가완료되었다는시그널을받으면사용자에게메시지출력 주방프로세스 주문 / 서빙프로세스에게시그널을받으면요리시작 요리마다일정시간이경과하면요리완료 주문이완료되기전에새로운주문이들어와도처리가가능해야함 등록된주문이없는경우요리소요시간으로알람설정 요리도중새로운주문이들어오는경우, 남은요리시간저장후알람을끄고, 새로운주문추가 힌트 : 추가할때현재진행중인요리를완성하기위해필요한시간과, 앞서등록된요리들의시간값을합산한후소요시간에서그값을뺀값으로등록 중단된남은소요시간으로다시알람설정

과제 ( 계속 ) 주방프로세스 ( 계속 ) 처리할시그널은 2 종류 주문도착 : SIGUSR1 조리완료 : SIGALARM SIGUSR1 처리 Case 1 : 조리중인요리가없는경우 COOK_TIME으로알람설정후대기 Case 2 : 현재조리중인요리가있는경우 알람을끄고남은시간저장 대기큐에주문추가 남은시간으로다시알람설정 SIGALARM 처리 주문 / 서빙프로세스에게 SIGUSR2 보내기 대기중인요리가있으면큐맨처음에있는것을꺼낸후그안에저장된시간으로알람설정후대기 alarm(cook_time); q_hdr 요리완료처리 alarm(q_hdr->n_time); r_time = alarm(0); insert_queue(q_hdr, COOK_TIME, r_time); alarm(r_time); n_time n_time

참고자료 (1) sigsetjmp 와 siglongjmp 시그널처리한후돌아갈위치설정 시그널처리한후루프맨처음으로이동하는식으로시그널을받은지점이아닌, 다른위치로가도록할수있음 goto 와비슷한성격을지니므로될수있으면이용하지않는것이좋다. 다음샘플코드실행결과비교

참고자료 (2) 공통부분 1 #include <sys/types.h> 2 3 #include <setjmp.h> 4 #include <stdio.h> 5 6 void main_menu(); 7 void goback(int); 8 9 sigjmp_buf position; 10 11 /********************************************************************/ 12 void main_menu() 13 { 14 int choice; 15 16 printf("######################\n"); 17 printf("### 1. Test1 ###\n"); 18 printf("### 2. Test2 ###\n"); 19 printf("### 3. Test3 ###\n"); 20 printf("### 4. Test4 ###\n"); 21 printf("######################\n"); 22 printf("choice? : "); 23 scanf("%d", &choice); 24 printf("choice = %d\n", choice); 25 printf("$$$$$$$$$$$\n"); 26 } 27

참고자료 (3) 28 /***************************************/ 29 void goback(int signo) 30 { 31 fprintf(stderr, "\ncatch INT\n"); 32 33 siglongjmp(position, 1); 34 } 35 36 /***************************************/ 37 int main() 38 { 39 static struct sigaction act; 40 41 act.sa_handler = goback; 42 sigaction(sigint, &act, NULL); 43 44 45 while(1) { 46 sigsetjmp(position, 1); 47 main_menu(); 48 } 49 50 } 28 /***************************************/ 29 void goback(int signo) 30 { 31 fprintf(stderr, "\ncatch INT\n"); 32 33 } 34 35 /***************************************/ 36 int main() 37 { 38 static struct sigaction act; 39 40 act.sa_handler = goback; 41 sigaction(sigint, &act, NULL); 42 43 while(1) { 44 main_menu(); 45 } 46 47 }