sighandler_t signal(int signum, sighandler_t handler)
handler에게 signum에 해당하는 signal을 보낸다. signal은 한마디로 interrupt 하여 바로 실행하게 만드는 신호(?)이다. 긴급하게 처리해야 될 event가 있을 때 주로 사용된다.
signal과 관련된 함수는 너무 많으므로 대표적인 것들을 소개해보겠다.
int kill (pid_t pid, int sig)
pid에 해당하는 프로세스에 sig에 해당하는 signal을 보내는 함수이다.
이 signal을 받은 프로세스는 blocking 상태라 하여도 바로 깨어난다.
int raise (int sig)
자기 자신에게 signal을 보내는 함수이다. 주로 테스트를 위해 사용한다.
unsigned alarm (unsigned sec)
sec초 후 SIGALRM을 보내달라는 함수이다. alarm 함수는 재미있는 것이 반환값이 previous alarm call의 time left이다. 예를 들어, 맨 처음의 alarm(5)의 반환 값은 이전에 alarm을 호출한 적이 없어서 0이다. 3초 후 alarm(10)을 호출했을 때의 반환 값은 2이다. 처음 alarm call에서 5라는 alarm time에서 3초가 지났기 때문에 time left가 2이기 때문이다. 5초가 지나지 않아 SIGALRM이 보내지지 않아도 그 이전에 새로운 alarm()이 호출되면 바로 reset 되고 10초 후 SIGALRM을 보내는 것으로 바뀐다. 다시 5초 후 세 번째 alaram(0)의 반환 값은 5이다. 10-5=5이기 때문이다. 여기서도 10초 전에 새로운 alarm()을 호출해서 alarm은 reset 되고 0초 후 SIGALRM이 울려야 되지만 0초는 지금 당장이므로 alarm(0)은 alarm을 끌 때 사용한다
void abort (void)
core dump and exit을 한다. 즉, 프로그램을 비정상적으로 바로 종료시킨다.
int pause (void)
현재는 waiting 상태로 어떤 signal이든지 도착하면 깨어난다. (signal이나 kill을 써서 signal을 보내면 깨어날 수 있겠지?)
unsigned int sleep (unsigned int seconds)
seconds초만큼 block 상태가 되었다가 seconds초 이후 깨어난다. 깨어날 때는 alarm과 마찬가지로 SIGALRM을 통해 깨어난다. 따라서, alarm과 sleep를 같이 사용하는 것은 권장되지 않는다.
int setjmp (jmp_buf env)
longjmp에 의해 jump되는 곳으로 longjmp의 매개변수에 있는 값을 지닌다
void longjmp (jmp_buf env, int val)
setjmp으로 jump하는 함수로 val 값을 줘서 setjmp에 도착할 시 반환 값으로 활용할 수 있게 한다.
system call 실행 중에 signal이 실행한 경우 interrupt가 가능하려면 blocked state를 TASK_INTURRUPTIBLE로 주고 불가능하게 하려면 TASK_UNINTURRUPTIBLE로 주면 된다.
'컴퓨터 공학 전공 > 시스템 프로그래밍' 카테고리의 다른 글
Memory Mapped File (0) | 2020.04.01 |
---|---|
IPC (0) | 2020.04.01 |
record lock (0) | 2020.04.01 |
Pipe (0) | 2020.04.01 |
fork, wait, exit, exec (0) | 2020.03.31 |