Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用SIGHUP重新启动终止进程_C++_Linux_Shell_Fork_Signals - Fatal编程技术网

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]