Какой лучший способ для запуска запущенной программы C или С++ из командной строки поставить себя в фоновом режиме, что эквивалентно запуску пользователя из оболочки unix с помощью & в конце команды? (Но пользователь этого не сделал.) Это графическое приложение и не требует ввода/вывода оболочки, поэтому нет причин связывать оболочку после запуска. Но я хочу, чтобы запуск командной оболочки был автоматически настроен без "&". (или в Windows).
В идеале я хочу решение, которое будет работать на любых Linux, OS X и Windows. (Или отдельные решения, которые я могу выбрать с помощью #ifdef.) Достаточно предположить, что это должно быть сделано в самом начале выполнения, а не где-то посередине.
Одно из решений заключается в том, чтобы основная программа была script, которая запускает реальный двоичный файл, тщательно помещая его в фоновый режим. Но кажется неудовлетворяющим необходимость в этих связанных оболочках/двоичных парах.
Еще одно решение - немедленно запустить еще одну выполненную версию (с помощью "system" или "CreateProcess" ) с теми же аргументами командной строки, но поместив дочерний элемент в фоновый режим, а затем с родительским выходом. Но это кажется неуклюжим по сравнению с тем, что процесс ставит себя на задний план.
Отредактировано после нескольких ответов. Да, fork() (или system() или CreateProcess в Windows) является одним из способов сделать это, что я намекнул в своем первоначальном вопросе, Но все эти решения делают ВТОРОЙ процесс, который основан на предыстории, а затем завершают исходный процесс. Мне было интересно, есть ли способ перевести EXISTING в фоновый режим. Одно из отличий заключается в том, что если приложение было запущено из script, который записал свой идентификатор процесса (возможно, для последующего убийства или другой цели), новый разветвленный или созданный процесс будет иметь другой идентификатор и, следовательно, не будет контролироваться никаким запуском script, если вы видите, что я получаю.
Изменить # 2:
fork() не является хорошим решением для OS X, где man-страница для "fork" говорит, что это небезопасно, если используются определенные фреймворки или библиотеки. Я попробовал это, и мое приложение громко жалуется во время выполнения: "Процесс разветвлен, и вы не можете безопасно использовать эту функциональность CoreFoundation. Вы ДОЛЖНЫ exec()".
Меня заинтриговал daemon(), но когда я попробовал его в OS X, он дал то же сообщение об ошибке, поэтому я предполагаю, что это просто причудливая оболочка fork() и имеет те же ограничения.
Простите центризм OS X, это как раз и есть система передо мной на данный момент. Но я действительно ищу решение для всех трех платформ.