标题:[实践OK]用c语言实现HUP信号重启进程的方法~ 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Fri, 11 Aug 2017 20:30:50 +0000 作者:jackxiang 地址:http://jackxiang.com/post/9406/ 内容: 背景:用Linux的信号Signal实现发信号给进程,是一种进程间通讯的办法,主要用来重新加载配置、重启服务、杀死进程、进程间通讯等。 下面就是一个通过向进程发送Signal信号以该进程退出,重新起了一新的子进程,用到了kill -HUP PID,主要是学习HUP信号的C语言编码方法。 #include #include #include #include #include #include #include #include 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); } gcc 编译: gcc nohup.c -o b.out 运行: ./a.out ps aux|grep b.out root 4919 0.0 0.1 4296 1328 pts/6 S+ 20:22 0:00 ./b.out kill -HUP 4919 #ps aux|grep b.out root 4958 0.0 0.1 4296 1324 pts/6 S 20:23 0:00 ./b.out From:http://www.jb51.net/article/37422.htm Generated by Jackxiang's Bo-blog 2.1.1 Release