가정
Signal이란 소프트웨어 인터럽트로 비동기적 event를 다룬다.
signals
$ kell -l
2) SIGINT(^C)
3) SIGQUIT(^\)
6) SIGABRT
8) SIGKILL
15) SIGALRM
15) SIGTERM
17) SIGCHLD
#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int);
/* 성공시 , 실패시 SIG_ERR 반환 */
int main(void) {
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
fatal("can't catch SIGUSR1");
if (signal(SIGUSR2, sig_usr) == SIG_ERR)
fatal("can't catch SIGUSR2");
for ( ; ; )
pause();
}
static void sig_usr(int signo){ /* argument is signal number */
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGUSR2)
printf("received SIGUSR2\n");
else {
printf("received signal %d\n", signo);
exit(1);
}
}
#include <signal.h>
void sig_int(int signo){
printf("in SIGINT handler()\n");
}
int main(){
signal(SIGINT, sig_int);
printf("step 1\n");
pause(); //interrupt종료, 여기로 SIGINT 날라옴
printf("step 2\n");
pause();
printf("step 3\n");
pause();
printf("step 4\n");
pause();
}
$ ./a.out
step 1 ^C
in SIGINT handler()
step 2 ^C
in SIGINT handler()
step 3 ^C
in SIGINT handler()
step 4 ^C
in SIGINT handler()
#include <signal.h>
void sig_int(int signo)
{
printf("in SIGINT handler()\n");
sleep(5);
}
int main()
{
signal(SIGINT, sig_int);
printf(" 1 pause()\n");
pause();
printf(" 2 pause()\n");
pause();
}
/* main.c */
#include <signal.h>
#include <unistd.h>
/* signal_exec */
int main(int argc, char** argv)
{
void sig_int(int signo);
signal(SIGINT, sig_int);
pause();
execl(argv[1], argv[1], (char*)0);
return 0;
}
void sig_int(int signo){
printf("SIGINT!! %d\n", signo);
}
---
/* exec.c */
#include <unistd.h>
/* exprog */
int main()
{
printf("executed program\n");
while(1)
pause();
}
# ./signal_exec exprog
^C
SIGINT!! 2
executed program
^C
#
/* main.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
void sig_usr1(int signo)
{
printf("BEFORE EXEC : in SIGUSR handler\n");
}
int main(int argc, char** argv)
{
/*
argv[1] : exec filename
*/
signal(SIGINT, SIG_IGN); //SIG_INT 무시함
signal(SIGUSR1, sig_usr1); //USR1은 원래 무시가 디폴트 벗 함수 정의
printf("BEFORE EXEC : puase()\n");
pause(); //시그널받음
execl(argv[1], argv[1], (char*)0);
}
/* exec.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
int main()
{
printf("EXEC : START PROGRAM\n");
printf("EXEC : RUN pause()\n");
pause();
}
$ gcc main.c –o main
$ gcc exec.c –o exec
$
$ ./main exec &
[1] 1828
BEFORE EXEC : puase()
$ kill –INT 1828 //ignore SIGINT
$ ps
PID TTY TIME CMD
1306 pts/1 00:00:00 bash
1828 pts/1 00:00:00 main
1829 pts/1 00:00:00 ps
$ kill –USR1 1828 //handler 실행
BEFORE EXEC : in SIGUSR handler
EXEC : START PROGRAM
EXEC : RUN pause()
$ kill -INT 1828 //pause()실행 상태에서 SIGINT 전송
$ ps
… (결과를 작성하시오) //무시되지않음. 1828(main)이 죽는다.
$ kill –USR1 1828
$ ps
… (결과를 작성하시오) //없는 곳에 kill보내니 위의 결과와 같음