C++ 使用SIGHUP重新启动终止进程
我有一个进程,当它被杀死时,我想再次启动它。为了实现这一点,我启动了子“监护人”进程,该进程使用C++ 使用SIGHUP重新启动终止进程,c++,linux,shell,fork,signals,C++,Linux,Shell,Fork,Signals,我有一个进程,当它被杀死时,我想再次启动它。为了实现这一点,我启动了子“监护人”进程,该进程使用prctl(PR\u SET\u PDEATHSIG,SIGHUP)捕获其父级的杀戮并再次启动 以下是监护人代码(省略记录): 和家长: int main() { if (fork() == 0) { execl("./guardian", 0); } while (1) { cout << "I am process\n";
prctl(PR\u SET\u PDEATHSIG,SIGHUP)
捕获其父级的杀戮并再次启动
以下是监护人代码(省略记录):
和家长:
int main() {
if (fork() == 0) {
execl("./guardian", 0);
}
while (1) {
cout << "I am process\n";
sleep(1);
}
return 0;
}
看起来不错。接下来,我使用kill-922084
终止进程。然后再次ps
输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1012 13058 0.0 0.3 20244 1932 pts/1 Ss+ 08:22 0:00 -sh
1012 12510 0.0 0.3 20784 1712 pts/0 Ss 08:14 0:00 -sh
1012 22091 0.0 0.1 17412 1012 pts/0 R+ 11:21 0:00 \_ ps fu
1012 22089 0.0 0.1 11484 996 pts/1 S 11:20 0:00 [process]
1012 22090 0.0 0.1 11484 996 pts/1 S 11:20 0:00 \_ [guardian]
当我再次终止进程时,kill-922089
guardian似乎没有收到SIGHUP回调(我从日志中检查过,这里省略了它们)
我的问题是-为什么卫报不站起来
我怀疑它可能与后台进程组有关——当进程重新启动时,它位于后台组中(比较ps stat中的S+和S) 当您在信号处理程序中处理
SIGHUP
时,SIGHUP
似乎被阻止fork()
和exec()
继承信号掩码,因此您的第二个监护人再也不会收到它
在
SIGHUP()之前的fork()
之后的信号处理程序中解除阻止SIGHUP
。在信号处理程序处理SIGHUP
时,似乎SIGHUP
被阻止fork()
和exec()
继承信号掩码,因此您的第二个监护人再也不会收到它
在fork()
之前的exec()
父级之后的信号处理程序中,取消阻止SIGHUP
。这太疯狂了。与其让孩子重新启动家长,为什么不让家长重新启动孩子?整个系统的设置都很简单。是的,我知道这没有多大意义。我正在复制android应用程序中的进程重启逻辑。Android启动应用程序(父进程),该进程启动监控父进程运行状况的监护人(子进程)。@Williampersell:没那么疯狂。我的防病毒软件显然也有类似的功能。杀死杀毒程序是黑客的一种标准策略,因此杀毒程序会创建自身的多个实例,每个实例都会创建一个守护者来监视被杀死的父对象。Kill-9是不可阻止和不可检测的——也就是说,在被终止的应用程序中。在子进程中可以检测到它。@David,但是让子进程监视父进程而不是让父进程监视子进程有什么好处呢?让家长监控孩子是件微不足道的事情,我看不出向后弯腰去看家长有什么好处。我能看到的唯一好处是(稍微)得到家长pid比找到孩子pid更容易,所以黑客可以轻易杀死家长。但是发现监控儿童并不困难,而且依靠对手无法找到奔跑儿童的PID的安全政策也相当脆弱。这太疯狂了。与其让孩子重新启动家长,为什么不让家长重新启动孩子?整个系统的设置都很简单。是的,我知道这没有多大意义。我正在复制android应用程序中的进程重启逻辑。Android启动应用程序(父进程),该进程启动监控父进程运行状况的监护人(子进程)。@Williampersell:没那么疯狂。我的防病毒软件显然也有类似的功能。杀死杀毒程序是黑客的一种标准策略,因此杀毒程序会创建自身的多个实例,每个实例都会创建一个守护者来监视被杀死的父对象。Kill-9是不可阻止和不可检测的——也就是说,在被终止的应用程序中。在子进程中可以检测到它。@David,但是让子进程监视父进程而不是让父进程监视子进程有什么好处呢?让家长监控孩子是件微不足道的事情,我看不出向后弯腰去看家长有什么好处。我能看到的唯一好处是(稍微)得到家长pid比找到孩子pid更容易,所以黑客可以轻易杀死家长。但找到监控儿童并不困难,依靠对手无法找到奔跑儿童的PID的安全策略也相当薄弱;sigp&x;sigaddset(&x,SIGHUP);sigprocmask(SIG_UNBLOCK,&x,NULL);sigset_t x;sigp&x;sigaddset(&x,SIGHUP);sigprocmask(SIG_UNBLOCK,&x,NULL);
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1012 13058 0.0 0.3 20244 1932 pts/1 Ss 08:22 0:00 -sh
1012 22084 0.0 0.1 11484 1004 pts/1 S+ 11:20 0:00 \_ ./process
1012 22085 0.0 0.1 11484 1000 pts/1 S+ 11:20 0:00 \_ [guardian]
1012 12510 0.0 0.3 20784 1712 pts/0 Ss 08:14 0:00 -sh
1012 22088 0.0 0.1 17412 1012 pts/0 R+ 11:20 0:00 \_ ps fu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1012 13058 0.0 0.3 20244 1932 pts/1 Ss+ 08:22 0:00 -sh
1012 12510 0.0 0.3 20784 1712 pts/0 Ss 08:14 0:00 -sh
1012 22091 0.0 0.1 17412 1012 pts/0 R+ 11:21 0:00 \_ ps fu
1012 22089 0.0 0.1 11484 996 pts/1 S 11:20 0:00 [process]
1012 22090 0.0 0.1 11484 996 pts/1 S 11:20 0:00 \_ [guardian]
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1012 13058 0.0 0.3 20244 1932 pts/1 Ss+ 08:22 0:00 -sh
1012 12510 0.0 0.3 20784 1712 pts/0 Rs 08:14 0:00 -sh
1012 22339 0.0 0.1 17412 1008 pts/0 R+ 11:27 0:00 \_ ps fu
1012 22090 0.0 0.1 11484 996 pts/1 S 11:20 0:00 [guardian]