Вот код, который будет работать в Linux. Он не имеет всех функций spwnProcess stdlib, он просто показывает основные основы, но расширение его здесь не сложно, если вам нужно больше.
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
работает, обратите внимание на то кошка умирает, когда родительский выход.
К тому же подходу я имею в виду «область действия (exit) {wait (thisProcessID); kill (appPID) ... ' –
Вы хотите, чтобы он убил их насильственно или просто заставил основную программу остаться в живых, пока дети не закончатся? http://stackoverflow.com/a/23587108/1457000 является ответом на убийство (ту же функцию можно использовать из D .... oh poop, вы используете функции высокого уровня, поэтому вы не можете вводить этот вызов в в нужном месте. Мне нужно переосмыслить это перед публикацией в качестве ответа). Ваше ожидание не будет работать, так как spawnProcess возвращает волшебный класс, и thisProcessId просто возвращает int. ожидание ожидает класс. Но, кроме того, ждать только работает на детей, я думаю, а не на родителей ... –
Привет, Адам, мне все равно, как близко, но мягко лучше. –