24
Linux/UNIX Programming APUE (Signals) 최최최 [email protected] 최최최최최 IT 최최 최최최최최최최

Linux/UNIX Programming APUE (Signals) 최미정[email protected] 강원대학교 IT 대학 컴퓨터과학전공

Embed Size (px)

Citation preview

Page 1: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

Linux/UNIX Programming

APUE (Signals)

최미정[email protected]

강원대학교 IT 대학 컴퓨터과학전공

Page 2: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 2

Signals

Signals are software interrupts from unexpected events

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

• a power failure

• an alarm clock

• the death of a child process

• a termination request from a user (Ctrl-C)

• a suspend request from a user (Ctrl-Z)

APUE (Signals)

ProcessSignal #8

Page 3: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 3

Predefined Signals (1/2)

31 signals

• /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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 4

Predefined Signals (2/2)

/usr/include/sys/iso/signal_iso.h

APUE (Signals)

Page 5: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 6

Handling of Signals

Disposition or action:Process has to tell the kernel “if and when this signal occurs, do the following.”

Ignore the signal:all signals can be ignored, except SIGKILL and SIGSTOP

Catch the signal:Call a function of ours when a signal occurs.

Let the default action apply:most are to terminate process

APUE (Signals)

Page 7: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 7

Representative UNIX Signals (1/2)

SIGART : generated by calling the abort function.

SIGALRM : generated when a timer set with the alarm expires.

SIGCHLD : whenever a process terminates or stops, the signal is sent to the parent.

SIGCONT : this signal sent to a stopped process when it is continued.

SIGFPE : signals an arithmetic exception, such as divide-by-0, floating point overflow, and so on

SIGILL : indicates that the process has executed an illegal hardware instruction.

SIGINT : generated by the terminal driver when we type the interrupt key and sent to all processes in the foreground process group.

APUE (Signals)

Page 8: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 8

Representative UNIX Signals (2/2)

SIGKILL : can’t be caught or ignored. a sure way to kill any process.

SIGPIPE : if we write to a pipeline but the reader has termi-nated, SIGPIPE is generated.

SIGSEGV : indicates that the process has made an invalid memory reference. ( core dumped)

SIGTERM : the termination signal sent by the kill(1) command by default.

SIGSTP : Cntl-Z from the terminal driver which is sent to all processes in the foreground process group.

SIGUSR1 : user defined signal 1

SIGUSR2 : user defined signal 2

APUE (Signals)

Page 9: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 12

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

실행 결과

APUE (Signals)

Page 13: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 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); // delay = strtol(argv[1], 0, 0); 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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 16

예제 : timelimit.c (3/3)

실행 결과

APUE (Signals)

Page 17: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 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

#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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 18

kill()

pid means• pid > 0 : signal to the process whose process ID is pid

• pid == 0 : signal to the processes whose process group ID equals that of sender

• pid < 0 : signal to the processes whose process group ID equals abs. of pid

• pid == -1 : unspecified (used as a broadcast signal in SVR4, 4.3 + BSD)

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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 19

alarm()

#include <unistd.h>

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

APUE (Signals)

alarm() sets a timer to expire at a specified time in future.• when timer expires, SIGALRM signal is generated,

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

Only one alarm clock per process• previously registered alarm clock is replaced by the new value.

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

Page 20: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 20

pause()

#include <unistd.h>

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

APUE (Signals)

suspends the calling process until a signal is caught.

returns only if a signal handler is executed and that handler re-turns.• 그냥 종료하던지 (signal handler 가 등록되지 않은 경우 ),

• signal handler 가 등록된 경우 해당 handler 가 처리를 마친 후 리턴한다 .

Page 21: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 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) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 22

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

Page 23: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 23

abort()

#include <stdlib.h>

void abort(void); This function never returns

APUE (Signals)

Causes abnormal program termination.

This function sends the SIGABRT signal to the process.

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

Page 24: Linux/UNIX Programming APUE (Signals) 최미정mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

UNIX System Program-mingby Yang-Sae Moon

Page 24

sleep()

#include <signal.h>

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

APUE (Signals)

This function causes the calling process to be suspended until either• The amount of wall clock time specified by second has elapsed (returns 0)

• A signal is caught by the process and the signal handler returns (returns the number of unslept seconds)