tahzibi.jafar Asked: 2024-11-04 21:15:10 +0800 CST2024-11-04 21:15:10 +0800 CST 2024-11-04 21:15:10 +0800 CST 如何继承孤立进程而不是 systemd 772 在《操作系统概念》一书(第 3.3.2 节)中,提到通过systemd(不是通过init),可以由另一个进程继承孤儿进程,而不是systemd。 bash我怎样才能在内部(命令行模式)和程序中做到这一点C? c 1 个回答 Voted Best Answer Shelton Liu 2024-11-04T21:58:41+08:002024-11-04T21:58:41+08:00 参考C 中的 prctl() PR_SET_CHILD_SUBREAPER(自 Linux 3.4 起)如果 arg2 非零,则设置调用进程的“子子收割者”属性;如果 arg2 为零,则取消设置该属性。当一个进程被标记为子子收割者时,它创建的所有子进程及其后代都将被标记为具有子收割者。实际上,子收割者为其后代进程履行 init(1) 的角色。当一个孤儿进程(即其直系父进程已经终止)终止并被标记为具有子收割者时,最近仍活着的祖先子收割者将收到 SIGCHLD 信号并能够等待(2) 该进程以发现其终止状态。 尝试使用 prctl(PR_SET_CHILD_SUBREAPER, 1) 调用,这将允许它采用孤立进程 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/prctl.h> #include <sys/types.h> #include <sys/wait.h> void spawn_orphan() { pid_t pid = fork(); if (pid == 0) { printf("Orphan process created with PID: %d\n", getpid()); sleep(10); // Keep it alive _exit(0); } } int main() { if (prctl(PR_SET_CHILD_SUBREAPER, 1) == -1) { perror("prctl"); exit(1); } spawn_orphan(); int status; pid_t orphan_pid; while ((orphan_pid = wait(&status)) > 0) { printf("Subreaper adopted orphan process PID: %d\n", orphan_pid); } return 0; }
参考C 中的 prctl()
尝试使用 prctl(PR_SET_CHILD_SUBREAPER, 1) 调用,这将允许它采用孤立进程