SIGHUP signal 관련문제
다음 프로그램은 linux socket programming책에 있는 데몬 재시작에 관한
예제입니다. 그런데 컴파일 해서 kill -HUP pid번호로 HUP시그널을
보내면 한번은 재시작이 되는데 두번째 부터는 HUP시그널을 날려도
먹지가 않네요. 왜 그럴까요?
#include
#include
#include
int isfirst;
char **command_args;
void sig_hangup(int signum)
{
if ( isfirst )
{
isfirst = 0;
fprintf(stderr, "Parent died\n");
}
else /* Restart! */
{
fprintf(stderr, "Restarting...\n");
/*** Kill all existing child processes ***/
execv(command_args[0], command_args);
fprintf(stderr, "Could not restart!!!\n");
abort();
}
}
void child(void)
{ struct sigaction act;
bzero(&act, sizeof(act));
act.sa_handler = sig_hangup;
act.sa_flags = SA_RESTART;
if ( sigaction(SIGHUP, &act, 0) != 0 )
perror("Can't capture SIGHUP");
for (;;)
{
fprintf(stderr, "[pid=%d] I'm still here\n", getpid
());
sleep(1);
}
exit(0);
}
int main(int count, char *strings[])
{
isfirst = 1;
command_args = strings;
if ( fork() == 0 )
child();
sleep(1);
return 0;
}
Re: SIGHUP signal 관련문제
정확한 원인은 메뉴얼 상에 나와 있지는 않네요.
다만 execve의 메뮤얼을 보면 signal과 open된 file은 상속된다고
나와 있네요.
이 중 signal이 상속 되어 진다면 그와 같은 상황이 될 수도 있다는
생각이 드네요.
그레서 그상속성을 끊기 위해 다음과 같이 수정 했습니다.
#include
#include
#include
int isfirst;
char **command_args;
void sig_hangup(int signum)
{
if ( isfirst )
{
isfirst = 0;
fprintf(stderr, "Parent died\n");
}
else /* Restart! */
{
fprintf(stderr, "Restarting...\n");
/*** Kill all existing child processes ***/
execv(command_args[0], command_args);
fprintf(stderr, "Could not restart!!!\n");
abort();
}
}
void child(void)
{
struct sigaction act;
bzero(&act, sizeof(act));
act.sa_handler = sig_hangup;
act.sa_flags = SA_RESTART | SA_NOMASK;
if ( sigaction(SIGHUP, &act, 0) != 0 ) perror("Can't capture
SIGHUP");
for (;;)
{
fprintf(stderr, "[pid=%d] (%d) I'm still here\n", getpid(),
isfirst);
sleep(5);
}
exit(0);
}
int main(int count, char *strings[])
{
int pid = 0;
isfirst = 1;
command_args = strings;
if ( (pid=fork()) == 0 ) child();
printf("child start %d\n", pid);
sleep(1);
return 0;
}
댓글 달기