-
signal
- software interrupt
- kernel => process / process => process
- ์๋ฃ ์ ์ก๋ณด๋ค๋ ๋น์ ์์ ์ธ ์ํฉ์ ์๋ฆด ๋ ์ฌ์ฉ
- ์คํ ํ๋ก์ธ์ค ์ค๋จ์ํค๋๊ฒ ์๋ ๋ชฉ์
-
์) program ์ํ ์ค CTRL + C (interrupt key) ๋๋ฅด๋ฉด, kernel์ด ๋ฌธ์๋ฅผ ๊ฐ์ง ํ ํด๋น session์ ์๋ ๋ชจ๋ process์๊ฒ SIGINT ๋ผ๋ signal์ ๋ณด๋ธ๋ค. ๋ชจ๋ process๋ ์ข ๋ฃ๋์ง๋ง shell process๋ ๋ฌด์
-
signal ์ข ๋ฅ
1. SIGHUP: ์ฐ๊ฒฐ๋ terminal์ด hangup ํ์ ๋(terminate) 2. SIGINT: interrupt key(^C)๋ฅผ ์ ๋ ฅํ์ ๋(terminate) 3. SIGQUIT: quit key(^\)๋ฅผ ์ ๋ ฅํ์ ๋(terminate+core) 4. SIGILL: illegal instruction์ ์ํํ์ ๋(terminate+core) 5. SIGTRAP: implementation defined hardware fault (terminate+core) 6. SIGABRT: abort ์์คํ ์ฝ์ ๋ถ๋ ์ ๋(terminate+core) 7. SIGBUS: implementation defined hardware fault (terminate+core) 8. SIGFPE: arithmetic exception, /0, floating-point overflow (terminate+core) 9. SIGKILL: process๋ฅผ kill ํ๊ธฐ ์ํ signal, catch ํน์ ignore ๋ ์ ์๋ signal(terminate) 10. SIGUSR1: user defined signal 1 (terminate) 11. SIGSEGV: invalid memory reference (terminate+core) 12. SIGUSR2: user defined signal 2 (terminate) 13. SIGPIPE: reader๊ฐ terminate ๋ pipe์ writeํ๋ ๊ฒฝ์ฐ ๋ฐ์(terminate) 14. SIGALRM: alarm ์์คํ ์ฝ ํ timer๊ฐ expire๋ ๊ฒฝ์ฐ(terminate) 15. SIGTERM: kill ์์คํ ์ฝ์ด ๋ณด๋ด๋ software termination signal (terminate) 16. SIGCHLD: child๊ฐ stop or exit๋์์ ๋ parent์๊ฒ ์ ๋ฌ๋๋ ์ ํธ(ignore) 17. SIGCONT: continue a stopped process (continue/ignore) 18. SIGSTOP: sendable stop signal, cannot be caught or ignored (stop process) 19. SIGTSTP: stop key(^Z)๋ฅผ์ ๋ ฅํ์์๋(stop process) 20. SIGTTIN: background process๊ฐ control tty๋ก๋ถํฐ readํ ๊ฒฝ์ฐ(stop process) 21. SIGTTOU: background process๊ฐ control tty๋ก writeํ ๊ฒฝ์ฐ(stop process) 22. SIGURG: urgent condition on IO, socket์ OOB data (ignore) 23. SIGXCPU: exceeded CPU time limit (terminate+core/ignore) 24. SIGXFSZ: exceeded file size limit (terminate+core/ignore) 25. SIGVTALRM: virtual time alarm, setitimer, (terminate) 26. SIGPROF: profiling time alarm, setitimer, (terminate) 27. SIGWINCH: terminal window size changed, (ignore) 28. SIGIO: ์ด๋ค fd ์์ asynchronous I/O event๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ(terminate/ignore) 29. SIGPWR: system power fail (terminate/ignore) 30. SIGSYS: bad argument to system call (terminate+core) ์ถ์ฒ: http://jangpd007.tistory.com/90 [์ฐธ ๋๋ผ์ด ์ธ์] -
signal์ ๊ธฐ๋ณธ์ฒ๋ฆฌ
- ์ข ๋ฃ(signal์ ์ํ ์ ์ ์ข ๋ฃ)
- ์ฝ์ด๋คํ ํ ์ข ๋ฃ(signal์ ์ํ ๋น์ ์ ์ข ๋ฃ) : core file(์ข ๋ฃ์ง์ ์ memory ์ํ) ์์ฑ ํ ์ข ๋ฃ
- ์ค์ง
- ๋ฌด์
1. SIG_DFL (SIG_PF)0 2. SIG_ERR (SIG_PF)-1 3. SIG_IGN (SIG_PF)1 4. SIG_HOLD (SIG_PF)2 ์ถ์ฒ: http://jangpd007.tistory.com/90 [์ฐธ ๋๋ผ์ด ์ธ์] -
Child process์ ์ข ๋ฃ ์ํ ํ์ธ
#include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char **argv) { pid_t pid; int status, exit_status; if((pid = fork()) < 0) { perror("fork failed"); exit(1); } if(pid == 0) { sleep(4); exit(5); } if(pid=wait(&status) == -1) { perror("wait failed"); exit(2); } if(WIFEXITED(status)) { exit_status = WEXITSTATUS(status); printf("Exit status from %d was %d\n", pid, exit_status); } exit(0); }
- ์๊ทธ๋์ ๋ฐ๊ณ ์ข ๋ฃํ ๊ฒฝ์ฐ, WTERMSIG ์๊ทธ๋ ๋ฒํธ๋ฅผ ๋ฐํํจ
if(WIFSIGNALED(status)) { printf("%d\n", WTERMSIG(status)); }
-
signal ๋ณด๋ด๊ธฐ
- pid : signal์ ๋ฐ๊ฒ๋ process ์ง์
- sig : ๋ณด๋ผ signal ์ง์
#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);
- ์๊ทธ๋์ ๋ฐ์ process ๋๋ process group ์ง์ ๊ฐ๋ฅ
- pid > 0 : ํด๋น id์ process์๊ฒ signal ์ ๋ฌ
- pid = 0 : sender์ ๊ฐ์ process group์ ์ํ๋ ๋ชจ๋ process์๊ฒ signal ์ ๋ฌ. sender ์์ ๋ ํฌํจ
- pid = -1: uid๊ฐ sender์ euid์ ๊ฐ์ ๋ชจ๋ process์๊ฒ signal ์ ๋ฌ. sender ์์ ๋ ํฌํจ
- pid < 0 & pid != -1 : process์ group id๊ฐ pid์ ์ ๋๊ฐ๊ณผ ๊ฐ์ ๋ชจ๋ process์๊ฒ signal ์ ๋ฌ. -7800 : 7800 group์ ๋์์ ์๊ทธ๋ ๋ณด๋ด๊ฒ ๋ค
- ๋ค๋ฅธ ์ฌ์ฉ์์ process์๊ฒ signal์ ๋ณด๋ด๋ฉด -1 return. ๋์ process์๊ฒ๋ง ๋ณด๋ผ ์ ์๊ณ , kernel๋ง ์๋ฌด process์ ๋ค ๋ณด๋ผ ์ ์์
- raise : raise ํจ์๋ฅผ ํธ์ถํ process์๊ฒ ์ง์ ํ sig๋ฅผ ๋ณด๋ธ๋ค
#include <signal.h> int raise(int sig);
-
Signal handling
- ๊ธฐ๋ณธ๋์ ์ํ. default action. ๊ฐ ์๊ทธ๋์ ๊ธฐ๋ณธ ๋์์ด ์ง์ ๋์ด ์์
- ์ง์ ๋ ํจ์ ์ํ. ์ ์๋ action. ํน์ ํจ์ ๋ง๋ค์ด์ ์คํ
- ์๊ทธ๋ ๋ฌด์
-
์ฑ ์๋ signal, sigset ์๋๋ฐ ์์ ๋ ์ ํจ. ๋ฐ๋ก sigaction ๊ตฌ์กฐ์ฒด ์ฌ์ฉํด์ ์๊ทธ๋ ์ฒ๋ฆฌํจ
-
sigaction
-
sigaction ์ง์ : signal ์์ ์ ์ํ๋ ํ๋์ ์ทจํ ์ ์๋๋ก ํ๋ค
-
SIGSTOP(process์ ์ผ์์ค๋จ), SIGKILL(process์ ์ข ๋ฃ)์ ๊ฒฝ์ฐ๋ ๋ณ๋์ action์ ์ทจํ ์ ์๋ค
-
์ง์ ๋ฐฉ๋ฒ
#include <signal.h> int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); struct sigaction{ void (*sa_handler)(int); sigset_t sa_mask; int sa_flags; void(*sa_sigaction)(int, siginfo_t *, void *) }
-
void(*sa_handler)(int);
- signo๋ฅผ ์์ ํ๋ฉด ์ทจํ ํ๋ ์ง์
- SIG_DFL. default ํ๋, ์ฆ ์ข ๋ฃ
- SIG_IGN. ๋ฌด์
- ์ ์๋ ํจ์. signal์ ๋ฐ์ผ๋ฉด ํจ์๋ก ์ ์ด ์ด๋, ํจ์ ์คํ ํ signal์ ๋ฐ๊ธฐ ์ง์ ์ ์ฒ๋ฆฌ ๋ฌธ์ฅ์ผ๋ก return
-
sigset_t sa_mask;
- ์ฌ๊ธฐ ์ ์๋ signal๋ค์, sa_handler์ ์ํด ์ง์ ๋ ํจ์๊ฐ ์ํ๋๋ ๋์ blocking ๋๋ค.
- ๋น์ฅ ์ฒ๋ฆฌํ์ง ์๊ณ ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๊ฒ ๋๋ด๊ณ ์ฒ๋ฆฌํ๊ฒ ๋ค. ์ฐ์ ์์๊ฐ ๋์ signal๋ค ๋จผ์ ์ฒ๋ฆฌ
-
int sa_flags
- SA_RESETHAND : handler๋ก๋ถํฐ ๋ณต๊ท ์ signal action์ SIG_DFL๋ก ์ฌ์ค์
- SA_SIGINFO : sa_handler ๋์ sa_sigaction ์ฌ์ฉ
-
-
sigaction ์ฌ์ฉ
- Ctrl + c ์ ๋ ฅ ๋ฐ์ผ๋ฉด ์ ์ํ ํจ์ ์คํ
#include <signal.h> int main(int argc, char **argv) { static struct sigaction act; void catchint(int); act.sa_handler = catchint; sigaction(SIGINT, &act, NULL); printf("sleep call1\n"); sleep(1); printf("sleep call2\n"); sleep(1); printf("exiting\n"); exit(0); } void catchint(int signo) { printf("CATCHINT : %d\n", signo); psignal(signo, "[Received Signal]"); }
-
Ctrl + c ์ ๋ ฅ ๋ฐ์ผ๋ฉด ๋ฌด์
act.sa_handler = SIG_IGN;
sigaction(SIGINT, &act, NULL);- Ctrl + c ์ ๋ ฅ ๋ฐ์ผ๋ฉด ์ข ๋ฃ
act.sa_handler = SIG_DFL;
sigaction(SIGINT, &act, NULL);- ์ฌ๋ฌ๊ฐ์ ์๊ทธ๋ ๋ฌด์ํ๋ ๊ฒฝ์ฐ
- SIGINT: interrupt key(^C)๋ฅผ ์ ๋ ฅํ์ ๋(terminate)
- SIGQUIT: quit key(^)๋ฅผ ์ ๋ ฅํ์ ๋(terminate+core)
act.sa_handler = SIG_IGN;
sigaction(SIGINT, &act, NULL);
sigaction(SIGQUIT, &act, NULL);-
ํ ํ๋ก์ธ์ค์์ ๋ฌด์๋๋ signal์ exec()ํ์๋ ๊ณ์ ๋ฌด์๋๋ค. exec์ผ๋ก ์คํํ๋ฉด process๊ฐ ๋์ผํ๊ธฐ ๋๋ฌธ์ signal์ ๊ณ์ ๋ฌด์ํ๊ฒ ๋๋ค
-
Signal ์งํฉ ์ง์
-
sigemptyset => sigaddset : ์ ๋ถ 0์ผ๋ก ์ค์ ํ ํ blockํ ์๊ทธ๋ ์ค์
-
sifgillset => sigdelset : ์ ๋ถ ๋ค 1๋ก ์ค์ ํ ํ blockํ์ง ์์ ์๊ทธ๋ ์ค์
-
์ฌ์ฉ๋ฐฉ๋ฒ
#include <signal.h> int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signo); int sigdelset(sigset_t *set, int signo); //0์ผ๋ก ์ค์ ๋๋์ง 1๋ก ๋๋์ง ํ์ธ int sigismember(sigset_t *set, int signo);
sigset_t mask1, mask2; sigemptyset(&mask1); sigaddset(&mask1, SIGINT); sigaddset(&mask1, SIGQUIT); sigfillset(&mask2); sigdelset(&mask2, SIGCHLD); if(sigismember(&mask1, SIGINT)) printf("SIGINT is setting.\n");
-
-
์์
-
์๊ทธ๋ ๋ณด๋ด๊ณ ์ง์ ๋ ํจ์๋ก ์ฒ๋ฆฌ
- blockํ ์๊ทธ๋ ์ค์ ์ ์๋ฌด๊ฒ๋ ํด์ฃผ์ง ์์๊ณ , SIGINT ์๊ทธ๋์ด ์ค๋ฉด ์ง์ ๋ ํจ์ ๋ง๊ณ ๊ธฐ์กด์ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ์ค์ ํ์
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <signal.h> #define BUFSIZE 512 void catchsig(int signo) { //์ ๋ฌ๋ฐ์ ์๊ทธ๋์ด ๋ฌด์์ธ์ง ์๋ ค์ฃผ๋ ํจ์ psignal(signo, "[Received Signal]"); } void do_child() { int i; static struct sigaction act; sigemptyset(&act.sa_mask); // sigaddset(&act.sa_mask, SIGINT); // sigaddset(&act.sa_mask, SIGUSR1); // sigaddset(&act.sa_mask, SIGUSR2); act.sa_handler = catchsig; //sigaction(SIGINT, &act, NULL); sigaction(SIGUSR1, &act, NULL); sigaction(SIGUSR2, &act, NULL); for(i=0;i<5;i++) { printf("child is running ... \n"); sleep(1); } } int main(int argc, char **argv) { int status; pid_t pid; pid = fork(); if(pid == 0) { do_child(); } else { sleep(2); kill(pid, SIGINT); sleep(1); kill(pid, SIGUSR1); sleep(1); kill(pid, SIGUSR2); } wait(&status); if(WIFEXITED(status)) { printf("Exit status from %d was %d\n", pid, WEXITSTATUS(status)); } else { printf("Exit status from %d was %d\n", pid, WTERMSIG(status)); } exit(0); }
-
์๊ทธ๋ ๋ณด๋ด๊ณ ์ง์ ๋ ํจ์๋ก ์ฒ๋ฆฌํ๋๋ฐ ์ง์ ๋ ์๊ทธ๋์ blockํ๊ธฐ
- blockํ ์๊ทธ๋๋ก SIGINT, SIGUSR1, SIGUSR2๋ฅผ ์ค์ ์ ํด๋์์. ๊ทธ๋ฌ๋ฉด ์ผ๋จ ์๊ทธ๋ ์ฒ๋ฆฌ๋ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๊ฐ ์์ ํ๋ก์ธ์ค ์ข ๋ฃ ํ block๋ ์ฒ๋ฆฌ๋ฅผ ํจ
-
SIGINT ์๊ทธ๋์ด ์ค๋ฉด ์ง์ ๋ ํจ์ ๋ง๊ณ ๊ธฐ์กด์ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ์ค์ ํ์
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <time.h> #include <ftw.h> #include <stdlib.h> #include <signal.h> #define BUFSIZE 512 void catchsig(int signo) { psignal(signo, "[Received Signal]"); } void do_child() { int i; static struct sigaction act; sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask, SIGINT); sigaddset(&act.sa_mask, SIGUSR1); sigaddset(&act.sa_mask, SIGUSR2); act.sa_handler = catchsig; sigaction(SIGINT, &act, NULL); sigaction(SIGUSR1, &act, NULL); sigaction(SIGUSR2, &act, NULL); for(i=0;i<5;i++) { printf("child is running ... \n"); sleep(1); } } int main(int argc, char **argv) { int status; pid_t pid; pid = fork(); if(pid == 0) { do_child(); } else { sleep(2); kill(pid, SIGINT); sleep(1); kill(pid, SIGUSR1); sleep(1); kill(pid, SIGUSR2); } wait(&status); if(WIFEXITED(status)) { printf("Exit status from %d was %d\n", pid, WEXITSTATUS(status)); } else { printf("Exit status from %d was %d\n", pid, WTERMSIG(status)); } exit(0); }
-
-
Signal ์งํฉ ์ง์ ์ค sa_sigaction()์ ์ํ signal handling
int main(void) { static struct sigaction act; act.sa_flags = SA_SIGINFO; act.sa_sigaction = handler; sigaction(SIGUSR1, &act, NULL); ... } void handler(int signo, siginfo_t *sf, ucontext_t *uc) { psiginfo(sf, "..."); printf("%d\n", sf->si_code); }
-
์ด์ ์ ์ค์ ๋ณต์ํ๊ธฐ
sigaction(SIGTERM, NULL, &oact);
act.sa_handler = SIG_IGN; sigaction(SIGTERM, &act, NULL); //do anything sigaction(SIGTERM, &oact, NULL);
#include<signal.h> static struct sigaction act, oact; // SIGTERM : ์ํํธ์จ์ด ์ข ๋ฃ ์๊ทธ๋ // SIGTERM ์ ์ํ ๊ณผ๊ฑฐ์ ํ๋์ ๋จ๊ฒจ๋๋ค sigaction(SIGTERM, NULL, &oact); // SIGTERM ์ ์ํ ์๋ก์ด ํ๋ ์ง์ . act.sa_handler = SIG_IGN; sigaction(SIGTERM, &act, NULL); /* ๋ฌด์ธ๊ฐ ์์ */ // ๊ณผ๊ฑฐ ํ๋ ๋ณต์ sigaction(SIGTERM, &oact, NULL);
-
Alarm signal ์ค์
-
Timer ์ฌ์ฉ
#include <signal.h> unsigned int alarm(unsigned int secs);
-
unsigned int secs : ์ด ๋จ์์ ์๊ฐ, ์๊ฐ ์ข ๋ฃ ํ SIGALRM์ ๋ณด๋ธ๋ค
-
alarm์ exec ํ์๋ ๊ณ์ ์๋ํ๋ค. ํ๋ก๊ทธ๋จ ๋ด์ฉ์ ๋ณํด๋ ํ๋ก์ธ๋ ๊ฐ๊ธฐ ๋๋ฌธ์
-
ํ์ง๋ง fork ํ์๋ ์์ process์ ๋ํ alarm์ ์๋ํ์ง ์๋๋ค. fork๋ alarm์ ์์ํ์ง ์์
-
์ฃผ์ : alarm(0) ์ alarm ๋๊ธฐ. ๋ฐ๋ก ์๋ ๋ณด๋ธ๋ค๋๊ฑฐ ์๋
-
alarm์ ๋์ ๋์ง ์์. 2๋ฒ ์ฌ์ฉ๋๋ฉด, ๋ ๋ฒ์งธ alarm์ด ๋์ฒด
-
๋ ๋ฒ์งธ alarm์ return ๊ฐ์ด ์ฒซ alarm์ ์์ฌ์๊ฐ
-
-
signal blocking
-
์ฌ์ฉ๋ฒ
#include <signal.h> int sigprocmask(int how, const sigset_t *set, sigset_t *oset)
-
oset์ ๋ด์๋ signal๋ค์ ํ์ฌ mask. ๊ด์ฌ์์ผ๋ฉด NULL๋ก ์ง์
-
์๊ทธ๋ ์งํฉ์ ์ฌ์ฉํด ํ ๋ฒ์ ์ฌ๋ฌ ์๊ทธ๋์ ๋ธ๋กํ ์ ์์
- how : ์๊ทธ๋์ ๋ธ๋กํ ๊ฒ์ธ์ง, ํด์ ํ ๊ฒ์ธ์ง ์ฌ๋ถ
- set : ๋ธ๋กํ๊ฑฐ๋ ํด์ ํ ์๊ทธ๋ ์งํฉ์ ์ฃผ์
- oset : NULL ๋๋ ์ด์ ์ค์ ๊ฐ์ ์ ์ฅํ ์๊ทธ๋ ์งํฉ์ ์ฃผ์
-
set์ ์ง์ ํ ์๊ทธ๋ ์งํฉ์ ๋ธ๋กํ ๊ฒ์ธ์ง, ํด์ ํ ๊ฒ์ธ์ง how์ ์ง์ ํด ํธ์ถํ๋ค.
- SIG_BLOCK : set์ ์ง์ ํ ์๊ทธ๋ ์งํฉ์ ์๊ทธ๋ ๋ง์คํฌ์ ์ถ๊ฐํ๋ค. ๋ด์ ์ ๊ฑฐ
- SIG_UNBLOCK : set์ ์ง์ ํ ์๊ทธ๋ ์งํฉ์ ์๊ทธ๋ ๋ง์คํฌ์์ ์ ๊ฑฐํ๋ค
- SIG_SETMASK : set์ ์ง์ ํ ์๊ทธ๋ ์งํฉ์ผ๋ก ํ์ฌ ์๊ทธ๋ ๋ง์คํฌ๋ฅผ ๋์ฒดํ๋ค. set์ ์๋ signal๋ค์ ์ง๊ธ๋ถํฐ ๋ด์
-
set์ ๋ธ๋กํ๊ฑฐ๋ ํด์ ํ ์๊ทธ๋ ์งํฉ์ ๊ฐ๋ฆฌํค๊ณ , ์ธ ๋ฒ์งธ ์ธ์์ธ oset์ NULL์ด ์๋๋ฉด ์ด์ ์ค์ ๊ฐ์ด ์ ์ฅ๋๋ค.
-
์์
int main(void) { sigset_t new; sigemptyset(&new); sigaddset(&new, SIGINT); sigaddset(&new, SIGQUIT); sigprocmask(SIG_BLOCK, &new, (sigset_t *)NULL); printf("Blocking Signals : SIGINT, SIGQUIT\n"); printf("Send SIGQUIT\n"); kill(getpid(), SIGQUIT); printf("Unblocking Signals\n"); sigprocmask(SIG_UNBLOCK, &new, (sigset_t *)NULL); return 0; }
-
์์ 2. input์ interrupt ํค ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
- ์ด๋ ๊ฒ ํ๋ฉด ์ ๋ ฅ์ ๋ฐ์ ํ์ interrupt ํค๋ ์๊ด์ด ์์ง๋ง, ์ ๋ ฅ ๊ธฐ๋ค๋ฆด ๋ ctrl+c interrupt ํค๋ฅผ ๋๋ฅด๋ฉด 0์ผ๋ก ์ ๋ ฅ์ ๋ฐ์๋ฒ๋ฆผ.
#define BUFSIZE 512 void catchint(int); int main(int argc, char **argv) { int i, j, num[10], sum = 0; static struct sigaction act; act.sa_handler = catchint; sigaction(SIGINT, &act, NULL); for(i=0;i<5;i++) { scanf("%d", &num[i]); sum += num[i]; for(j=0;j<=i;j++) { printf("...%d\n", num[i]); sleep(1); } } exit(0); } void catchint(int signo) { printf("DO NOT INTERRUPT ... \n"); }
- ๊ทผ๋ฐ scanf๋ก ์ ๋ ฅ์ ๋ฐ์ ๋ ctrl+c interruptํค๋ฅผ block ์์ผ์ฃผ๊ณ ์ ๋ ฅ์ ๋ฐ์ ํ์ ๋ค์ ํ์ด์ฃผ๋ฉด ์ ๋๋ก ์ ๋ ฅ์ ๋ฐ์ ์ ์์
#define BUFSIZE 512 void catchint(int); int main(int argc, char **argv) { int i, j, num[10], sum = 0; static struct sigaction act; sigset_t mask; act.sa_handler = catchint; sigaction(SIGINT, &act, NULL); sigemptyset(&mask); sigaddset(&mask, SIGINT); for(i=0;i<5;i++) { sigprocmask(SIG_SETMASK, &mask, NULL); scanf("%d", &num[i]); sigprocmask(SIG_UNBLOCK, &mask, NULL); sum += num[i]; for(j=0;j<=i;j++) { printf("...%d\n", num[i]); sleep(1); } } exit(0); } void catchint(int signo) { printf("DO NOT INTERRUPT ... \n"); }
-
-
pause ์์คํ ์ฝ
-
์ฌ์ฉ๋ฒ
#include <unistd.h> int pause(void);
-
signal ๋์ฐฉ๊น์ง ์คํ์ ์ผ์ ์ค๋จ(CPU ์ฌ์ฉ ์์ด)
-
signal์ด ํฌ์ฐฉ๋๋ฉด ์ฒ๋ฆฌ routine ์ํ & -1 return
-