linux/unix programming apue (signals )

26
Linux/UNIX Programming APUE (Signals)

Upload: kenton

Post on 22-Jan-2016

100 views

Category:

Documents


1 download

DESCRIPTION

Linux/UNIX Programming APUE (Signals ). Signals. APUE (Signals). Signals are software interrupts( 가로채기 ) an illegal operation (e.g., divide by 0 ) an alarm clock the death of a child process a termination request from a user a suspend request from a user. Process. Signal ##. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Linux/UNIX Programming APUE (Signals )

Linux/UNIX Programming

APUE (Signals)

Page 2: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 2

Signals

Signals are software interrupts( 가로채기 )

• an illegal operation (e.g., divide by 0)

• an alarm clock

• the death of a child process

• a termination request from a user

• a suspend request from a user

APUE (Signals)

ProcessSignal ##

Page 3: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 3

Predefined Signals (1/2)

define

• /usr/include/signal.h (/usr/include/sys/iso/signal_iso.h)

Every signal has a name• begin with ‘SIG’

• SIGABRT: abort signal from abort()

• SIGALRM: alarm signal from alarm()

Actions of the default signal handler• terminate the process and generate a core(dump)

• ignores and discards the signal(ignore)

• suspends the process (suspend)

• resume the process

APUE (Signals)

Page 4: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 4

Predefined Signals (2/2)

/usr/include/asm/signal.h

APUE (Signals)

Page 5: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 5

Signal Generation

Terminal-generated signals• CTRL-C SIGINT

• CTRL-Z SIGSTP signal

Hardware excepts generate signals• divide by 0 SIGFPE

• invalid memory reference SIGSEGV

kill()• sends any signal to a process or process group

• need to be owner or super-user

Software conditions• SIGALRM: alarm clock expires

• SIGPIPE: broken pipe

• SIGURG: out-of-band network data

APUE (Signals)

Page 6: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 6

Handling of Signals

Ignore the signal:모든 시그널은 무시할 수 있음 , 단 SIGKILL and SIGSTOP 은 예외

signal catching function:시그널 발생시 호출될 함수를 지정할 수 있음

Let the default action apply:most are to terminate process

APUE (Signals)

Page 7: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 7

Representative UNIX Signals (1/2)

SIGART : 비정상 종료 ( 종료 + 코어덤프 )

SIGALRM : 타이머 만료 ( 종료 )

SIGCHLD : 자식의 상태 변화 ( 무시 )

SIGCONT : 중단된 프로세스의 실행 재개 ( 재개 / 무시 )

SIGFPE : 산술예외 , such as divide-by-0 ( 종료 + 코어덤프 )

SIGILL : 적법하지 않은 명령 ( 종료 + 코어덤프 )

SIGINT : 터미널 가로채기 ( 종료 )

APUE (Signals)

Page 8: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 8

Representative UNIX Signals (2/2)

SIGKILL : 종료 , 무시할수 없음 ( 종료 )

SIGPIPE : 리더가 없는 파이프 쓰기 ( 종료 )

SIGSEGV : 유효하지 않은 메모리 참조 ( 종료 + 코어덤프 )

SIGTERM : 종료 ( 종료 )

SIGSTOP : 중단 ( 프로세스 중단 )

SIGUSR1 : user defined signal 1( 종료 )

SIGUSR2 : user defined signal 2( 종료 )

APUE (Signals)

Page 9: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 9

signal()

Signal Handler 등록

signal(int signo, void(*func)()))

• specify the action for a signal (signo func)

• func

− SIG_IGN (ignore)

− SIG_DFL (default)

− user-defined function

• Return: the previous func

APUE (Signals)

Page 10: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 10

예제 : alarm1.c (w/o handler)

#include <stdio.h> // alarm1.cmain( ){

alarm(3);printf(“Looping forever …\n”);while (1);printf(“This line should never be executed\n”);

}

APUE (Signals)

Page 11: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 11

예제 : alarm2.c (w/ handler) (1/2)

#include <stdio.h> // alarm2.c#include <signal.h>

int alarmFlag=0;void alarmHandler();

main( ) { signal(SIGALRM, alarmHandler); alarm(3); printf("Looping …\n"); while(!alarmFlag) { pause( ); } printf("Loop ends due to alarm signal \n");}

void alarmHandler( ) { printf("An alarm clock signal was received\n"); alarmFlag = 1;}

APUE (Signals)

Page 12: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 12

예제 : alarm2.c (w/ handler) (2/2)

실행 결과

APUE (Signals)

Page 13: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 13

SIGCHLD

Whenever a process terminates or stops, the signal is sent to the parent.

자식 프로세스는 자신이 죽을 때 , 부모 프로세스에게 SIGCHLD 를 보낸다 .

APUE (Signals)

Page 14: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 14

예제 : timelimit.c (1/3)

#include <stdio.h> // timelimit.c#include <signal.h>

int delay;void childHandler( );

main(int argc, char *argv[]){ int pid;

sscanf(argv[1], "%d", &delay); signal(SIGCHLD,childHandler);

pid = fork(); if (pid == 0) { // child execvp(argv[2], &argv[2]); perror("Limit"); } else { // parent sleep(delay); printf("Child %d exceeded limit and is being killed\n", pid); kill(pid, SIGINT); }}

$ timelimit N command // command 를 N seconds 안에 수행하라 !

APUE (Signals)

Page 15: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 15

예제 : timelimit.c (2/3)

childHandler( ) /* Executed if the child dies before the parent */

{

int childPid, childStatus;

childPid = wait(&childStatus);

printf(“Child %d terminated within %d seconds\n”, childPid, delay);

exit(0);

}

APUE (Signals)

Page 16: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 16

예제 : timelimit.c (3/3)

실행 결과

APUE (Signals)

Page 17: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 17

kill(), raise()

kill - sends a signal to a process or a group of processes

raise - function allows a process to send a signal to itself

raise(signo) == kill(getpid(), signo);

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

int kill(pid_t pid, int signo);int raise(int signo); Both return: 0 if OK, 1 on error

APUE (Signals)

Page 18: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 18

kill()

pid means• pid > 0 : 프로세스 ID 가 pid 인 프로세스에 신호를 보낸다 .

• pid == 0 : 프로세스 그룹 ID 가 동일한 모든 프로세스에게 신호를 보낸다 .

• pid < 0 : 프로세스 그룹 ID 가 pid 인 모든 프로세스에게 신호를 보낸다 .

• pid == -1 : 모든 프로세스에 신호를 보낸다 .(boradcast)

Permission to send signals• The super-user can send a signal to any process.

• The real or effective user ID of the sender has to equal the real or effective user ID of the receiver.

APUE (Signals)

Page 19: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 19

alarm()

#include <unistd.h>

unsigned int alarm (unsigned int seconds); Returns: 0 or number of seconds until previously set alarm

APUE (Signals)

alarm() 는 지정된 시간 이후에 만료될 타이머를 설정하는데 사용• when timer expires, SIGALRM signal is generated,

• default action of the signal is to terminate the process.

Only one alarm clock per process• 이전에 설정한 타이머가 만료되지 않은 상황에서 alarm 을 호출하면 타이머는 새로운

값으로 설정됨

if alarm(0), a previous unexpired alarm is cancelled.

Page 20: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 20

pause()

#include <unistd.h>

int pause (void); Returns: -1 with errno set to EINTR

APUE (Signals)

신호가 전달될 때까지 프로세스를 일시정지 시킴

Signal handler 의 실행이 끝날 때까지 차단된다 .• signal handler 가 등록된 경우 해당 handler 가 처리를 마친 후 리턴한다 .

Page 21: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 21

예제 : mysleep.c (1/2)

#include <signal.h> // mysleep.c#include <unistd.h>

static void sig_alrm(int signo) { return; /* nothing to do, just return to wake up the pause */}

unsigned int mysleep(unsigned int nsecs) { if (signal(SIGALRM, sig_alrm) == SIG_ERR) return nsecs; alarm(nsecs); /* start the timer */ pause(); /* next caught signal wakes us up */ return alarm(0); /* turn off timer, return unslept time */}

APUE (Signals)

상기 mysleep() 함수는 다음과 같은 몇 가지 문제점을 안고 있다 .• 만일 mysleep() 을 사용하기 이전에 alarm 을 set 한 경우 , 앞서의 alarm 이

지워진다 .

• Race condition 이 발생할 수 있다 ( 즉 , pause() 가 호출되기 전에 alarm 이 발생할 수 있다 .).

상기 문제 해결을 위해서는 보다 견고한 mysleep() 의 구현이 필요하다 .

Page 22: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 22

예제 : mysleep.c (2/2)APUE (Signals)

Page 23: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 23

abort()

#include <stdlib.h>

void abort(void); This function never returns

APUE (Signals)

abnormal program termination.

This function sends the SIGABRT signal to the process.

raise(SIGABRT)

SIGABRT signal handler to perform any cleanup that it wants to do, before the process terminated.

Page 24: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 24

sleep()

#include <signal.h>

unsigned int sleep(unsigned int seconds) ; Returns: 0 or number of unslept seconds

APUE (Signals)

호출한 프로세스를 일시 정시 상태로 만듬 , 아래 두가지 조건중 하나가 발생하면 깨어남• 타이머가 만료 된 경우

• 프로세스가 신호를 잡았으며 해당 신호 처리부가 반환 될 경우

Page 25: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 25

sigaction()

#include <signal.h>

int sigaction(int sig, struct sigaction * act, struct sigaction * act) ;

return: 0 if OK, 1 on error

APUE (Signals)

sigaction 구조체를 사용해 핸들러를 등록

strcut sigaction {

void (* sa_handler)(int) // 핸들러

sigset_t sa_mask // 차단할 신호들

int sa_flags; // 옵션들

}

Page 26: Linux/UNIX Programming APUE (Signals )

UNIX System Program-mingPage 26

sigaction()

#include <signal.h>#include <stdio.h>#include <unistd.h>void ouch(int sig) { print(“OUCH! – I got signal %d\n”, sig);

int main(){

struct sigaction act;act.sa_handler = ouch;sigemptyset(&act.sa_mask);act.sa_flags = 0;

sigaction(SIGINT, &act, 0);

wihle(1) {printf(“hello world\n”);sleep(1);

}}

APUE (Signals)