У меня есть длительный процесс, и мне нужно, чтобы он запускал другой процесс (который тоже будет работать в тоже время). Мне нужно только запустить его, а затем полностью забыть об этом.Как запустить и забыть подпроцесс?
Мне удалось сделать то, что мне нужно, вычеркнув какой-то код из книги программирования Ruby, но я хотел бы найти лучший/правильный способ и понять, что происходит. Вот что я первоначально получил:
exec("whatever --take-very-long") if fork.nil?
Process.detach($$)
Итак, это путь, или как еще я должен сделать это?
После проверки ответов ниже, я закончил с этим кодом, который, кажется, больше смысла:
(pid = fork) ? Process.detach(pid) : exec("foo")
Я оценил бы какое-то объяснение о том, как fork
работ. [получил это уже]
Был ли отсоединен $$
? Я не знаю, почему это работает, и мне очень хотелось бы лучше понять ситуацию.
Хорошо, я думаю, что получил .nil? проверить. В ребенке он действительно не возвращает 0, он возвращает nil. Таким образом, exec будет выполняться, если вы находитесь у ребенка. Итак, как бы я захватил другой возврат вилки, тот, который возвращает идентификатор дочернего процесса? Таким образом, я мог бы использовать его напрямую, вместо того, чтобы полагаться на $$. – kch
просто вызовите fork и запишите результат. то, если вы получили нуль, выполните exec, иначе вы находитесь в родительском. – Alnitak
Это такое яркое и четкое определение «вилка». Отличная работа, спасибо. – KomodoDave