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