создание фонового приложения с помощью fork () - PullRequest
1 голос
/ 08 февраля 2011

Итак, у меня есть приложение, которое использует потоки.Теперь, когда программа запускается в первый раз, я хочу, чтобы она прошла настройку соединений с базой данных и еще много чего, прежде чем она станет фоновой, чтобы любой / кто бы ни запускал программу, мог знать, была ли ошибка при запуске.

Я сделалнекоторые смотрят вокруг и находят некоторые ресурсы, которые говорят «не смешивайте форк и нити», в то время как другие говорят, что разветвление в linux будет только дублировать основной поток и оставит остальных в покое.
В случае последнего (где этопросто дублирует основной поток), как тогда потоки обращаются к переменным уровня файла (глобальным)?Разве потоки не смогут получить доступ к переменным, которые теперь находятся в адресном пространстве разветвленного процесса?

В конечном итоге цель состоит в том, чтобы получить сам фон приложения после создания потоков.Если это невозможно, я могу поставить разветвление перед созданием потока, просто хотел бы сделать это как можно позже.

Примечание: во время разветвления потоки будут спать (), пока основной поток не поместит данные в общую переменную для их обработки.Поэтому, если сон прервется, им не причинят вреда.

Ответы [ 3 ]

3 голосов
/ 08 февраля 2011

Нет способа дублировать потоки как часть fork, и все потоки родителя будут прерваны при выходе из родителя, поэтому даже если они смогут получить доступ к памяти ребенка, это не поможет. Вам нужно либо создать свои потоки после разветвления, либо использовать pthread_atfork для регистрации обработчиков, которые воссоздают их в дочернем процессе. Я бы порекомендовал просто подождать, пока не разветвятся, чтобы создать свои темы, так как это намного проще и эффективнее.

Почему вы хотите отложить разветвление как можно дольше? Если вы хотите сохранить соединение с терминалом или чем-то еще до завершения инициализации, вы можете просто дождаться завершения родительского процесса до завершения инициализации дочернего процесса (с его потоками) и готовности быть «в фоновом режиме». Для этого могут быть использованы различные инструменты синхронизации. Один простой способ - открыть канал, по которому потомок отправляет свой вывод родителю для отображения; родитель может просто выйти, когда получит EOF на этом канале.

0 голосов
/ 08 февраля 2011

Когда поток в процессе вызывает fork(), создается новый процесс путем копирования, среди прочего, (1) полного адресного пространства процесса и (2) (одного) потока, вызвавшего fork,Если в процессе есть другие потоки, они не копируются.Это почти наверняка приведет к ошибкам в вашей программе.Отсюда совет не смешивать потоки и вилки.

Если вы хотите создать фоновый процесс со многими потоками, вы должны разветвить его, прежде чем создавать любой другой поток.Затем два процесса ведут себя нормально, как и любые два изолированных процесса: потоки в одном процессе совместно используют одну и ту же память, но фоновые потоки и процесс переднего плана не будут совместно использовать память (по умолчанию).

0 голосов
/ 08 февраля 2011

Формирование процесса создает два разных процесса, и потоки в одном процессе не смогут получить доступ к памяти во втором процессе. Если вы хотите, чтобы разные процессы обращались к одной и той же памяти, вам нужно нечто, называемое общей памятью.

...