signal

Jin·2022년 2월 27일
0

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로 주면 됩니다.

profile
배워서 공유하기

0개의 댓글