对 HUP 信号的处理

zz_d 2013-01-09 04:20:29
一般对进程发送 HUP 信号, 会让进程重启.
以下为我的一个实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <syslog.h>
#include <stdarg.h>

char **bak_argv;

void sighup_restart(int sig);

// argv[0] 尽量使用绝对路径, 因为程序执行过程中可能会使用 chdir() .
int main(int argc, char *argv[])
{
openlog("sig_hup", LOG_PID, 0);
syslog(LOG_ERR, "%s", argv[0]);
closelog();

bak_argv = argv;
signal(SIGHUP, sighup_restart);
while(1)
sleep(10);
return 0;
}

void sighup_restart(int sig)
{
switch(fork())
{
case -1:
openlog("sig_hup", LOG_PID, 0);
syslog(LOG_ERR, "fork failed: %s", strerror(errno));
closelog();

exit(EXIT_FAILURE);
break;
case 0:
break;
default:
exit(EXIT_SUCCESS);
}
execv(bak_argv[0], bak_argv);

openlog("sig_hup", LOG_PID, 0);
syslog(LOG_ERR, "execv(%s, ...) failed: %s\n", bak_argv[0], strerror(errno));
closelog();

exit(EXIT_FAILURE);
}



第一次执行 "kill -s HUP pid" , 程序表现正常.
之后再执行 "kill -s HUP pid", 则没有作用.

Thanks.
...全文
178 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zz_d 2013-01-11
  • 打赏
  • 举报
回复
block ... 明白了, 是因为父进程对 HUP 信号的处理函数并没有返回. 这样实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <syslog.h>
#include <stdarg.h>

char **bak_argv;
int flag = 0;

void restart(void);
void sighup_handler(int sig);

// argv[0] 尽量使用绝对路径, 因为程序执行过程中可能会使用 chdir() .
int main(int argc, char *argv[])
{
	openlog("sig_hup", LOG_PID, 0);
	syslog(LOG_ERR, "%s", argv[0]);
	closelog();
	
	bak_argv = argv;
	signal(SIGHUP, sighup_handler);
	
	while(1)
	{
		if(flag)
			restart();
		sleep(10);
	}
	return 0;
}

void sighup_handler(int sig)
{
	flag = 1;
}

void restart(void)
{
	switch(fork())
	{
		case -1:
			openlog("sig_hup", LOG_PID, 0);
			syslog(LOG_ERR, "fork failed: %s", strerror(errno));
			closelog();
			
			exit(EXIT_FAILURE);
			break;
		case 0:
			break;
		default:
			exit(EXIT_SUCCESS);
	}
	execv(bak_argv[0], bak_argv);
	
	openlog("sig_hup", LOG_PID, 0);
	syslog(LOG_ERR, "execv(%s, ...) failed: %s\n", bak_argv[0], strerror(errno));
	closelog();
	
	exit(EXIT_FAILURE);
}

以上的代码一切正常. Thanks "oyq_yangy" very much.
oyq_yangy 2013-01-11
  • 打赏
  • 举报
回复
子进程继承了父进程的block位,用sigprocmask把它清掉
zz_d 2013-01-10
  • 打赏
  • 举报
回复
谢谢. 我每一次执行 "kill -s HUP pid" 会先查询进程的 pid .
mymtom 2013-01-09
  • 打赏
  • 举报
回复
第一次执行 "kill -s HUP pid" 之后,进程的pid就变了。

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧