这个有点旧,但没有得到完整的答案。这是我在嵌入式系统上所做的,以生成与父级无关的 bash 子级。请注意,我执行了一个 bash shell,然后在另一个 bash shell 中运行我的命令。在您的情况下,这可能不是必需的。对我来说,它允许我做一些没有它就无法正常工作的 I/O 重定向。
两个重要的概念是 setsid() 和双 fork()。这两者的结合可以防止在孤儿完成时创建僵尸,以及在父母完成时防止孤儿被杀死。
可能会出现许多其他问题,例如继承的 I/O 句柄、工作目录等,但此代码完成了基本工作。
int spawn_orphan(char* cmd) {
char command[1024]; // We could segfault if cmd is longer than 1000 bytes or so
int pid;
int Stat;
pid = fork();
if (pid < 0) { perror("FORK FAILED\n"); return pid; }
if (pid == 0) { // CHILD
setsid(); // Make this process the session leader of a new session
pid = fork();
if (pid < 0) { printf("FORK FAILED\n"); exit(1); }
if (pid == 0) { // GRANDCHILD
sprintf(command,"bash -c '%s'",cmd);
execl("/bin/bash", "bash", "-c", command, NULL); // Only returns on error
perror("execl failed");
exit(1);
}
exit(0); // SUCCESS (This child is reaped below with waitpid())
}
// Reap the child, leaving the grandchild to be inherited by init
waitpid(pid, &Stat, 0);
if ( WIFEXITED(Stat) && (WEXITSTATUS(Stat) == 0) ) {
return 0; // Child forked and exited successfully
}
else {
perror("failed to spawn orphan\n");
return -1;
}
}