当主进程突然死亡时,如何杀死linux spawnProcess?

时间:2017-01-02 14:18:48

标签: linux process d exit

我遇到了我的应用程序和spawnProcess的问题。 如果由于某种原因主要应用程序死亡/被杀死,那么生成的进程似乎仍然存在,除非我使用终端通过其PID来终止它们,否则我无法访问它们。我的目标是,如果主应用程序死亡,那么生成的进程也应该以某种方式被杀死。

我的代码就像这样

auto appPid = spawnProcess("path/to/process");
scope(exit){ auto exitcode = wait(appPid); 
stderr.writeln(...);}

如果我在主进程终止时使用相同的方法,使用wait(thisProcessID)我会收到错误。 "没有超载匹配"。任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

以下是一些将在Linux上执行此操作的代码。它没有stdlib的spawnProcess的所有功能,它只显示了基础知识,但如果你需要更多的话,从这里扩展它并不难。

import core.sys.posix.unistd;

version(linux) {
        // this function is Linux-specific
        import core.stdc.config;
        import core.sys.posix.signal;
        // we can tell the kernel to send our child process a signal
        // when the parent dies...
        extern(C) int prctl(int, c_ulong, c_ulong, c_ulong, c_ulong);
        // the constant I pulled out of the C headers
        enum PR_SET_PDEATHSIG = 1;
}

pid_t mySpawnProcess(string process) {
        if(auto pid = fork()) {
                // this branch is the parent, it can return the child pid
                // you can:
                // import core.sys.posix.sys.wait;
                // waitpid(this_ret_value, &status, 0);
                // if you want the parent to wait for the child to die
                return pid;
        } else {
                // child

                // first, tell it to terminate when the parent dies
                prctl(PR_SET_PDEATHSIG, SIGTERM, 0, 0, 0);

                // then, exec our process
                char*[2] args;
                char[255] buffer;
                // gotta copy the string into another buffer
                // so we zero terminate it and have a C style char**...
                buffer[0 .. process.length] = process[];
                buffer[process.length] = 0;
                args[0] = buffer.ptr;

                // then call exec to run the new program
                execve(args[0], args.ptr, null);
                assert(0); // never reached
        }
}

void main() {
        mySpawnProcess("/usr/bin/cat");
        // parent process sleeps for one second, then exits
        usleep(1_000_000);
}

因此需要使用较低级别的函数,但Linux确实具有满足您需要的功能。

当然,由于它发送了一个信号,你的孩子可能想要处理它比默认终止更优雅地关闭,但尝试这个程序并在睡眠时运行ps以查看cat正在运行,然后注意当父母退出时猫死了。