Friday, May 16, 2008

Signals, reentrancy

signal을 처리하고 있는데 다른 signal이 들어와서 중간에 다른 루틴을 수행한다면? 그 과정이 계속 반복된다면? 혼란스러운 일이다. 그래서 signal을 처리할 때는 이를 약간 고려해줘야한다. global 데이터는 손데지 않고, shared data도 안건드리는 것은, 좋은 습관이다. handler에서 malloc()을 호춣거나 strsignal()과 같이 static buffer를 사용하는 경우 중간에 들어오는 signal에 대해 어떻게 처리될지 알아두는 것은 좋은 일이다. reentrant function 이라함은 같은 프로세스내의 다른 thread에 의해 호출되어도 '안전'한 경우를 말한다. 이를 위해서는 아래 내용들이 지켜져야한다.

  • static data를 조작하면 안되고,

  • stack에 있는 데이터나 caller가 준 데이터만 조작한다

  • 다른 nonreentrant function을 호출하지 않는다,


재진입가능한 함수들에 대해서는 ... 종류가 많은데 필요하면 그때 책을 참조하는 것으로 하자. 일반적으로 abort, bind, connect, fork, fsync, kill, read, send, signal, time, wait, open, pipe, select, poll, recv, sock 등은 reentrant하지만, malloc 등은 그렇지 않다.

No comments:

Post a Comment