Как создать процесс в C, который запускается после смерти родителя? - PullRequest
2 голосов
/ 14 января 2012

Я пишу простую программу на C, которая открывает интернет-браузер с помощью функции exec.Однако программа не завершает работу, пока я не закрою интернет-браузер.

Как лучше написать эту программу, чтобы она открывала интернет-браузер и затем заканчивалась?

Ответы [ 3 ]

2 голосов
/ 14 января 2012

Вызовите API ShellExecute, передав URL (не путь к браузеру!)

Это вызовет предпочтительный браузер пользователя и немедленно вернется.

Затем вызовите ExitProcess, что завершит вашу программу. Браузер будет работать.

Также есть функции spawn* , но их не рекомендуется использовать для веб-страниц, поскольку они открывают определенное приложение, а не соблюдают предпочтения браузера пользователя. Но для вашего личного использования, идти вперед. Как и ShellExecute, spawn может вернуться немедленно, так что вы можете exit() родительский процесс, используйте флаг _P_NOWAIT или _P_DETACH.

2 голосов
/ 14 января 2012

Когда вы используете exec, весь ваш процесс заменяется изображением нового процесса, а текущий перестает существовать.Вместо этого fork заранее новый процесс (и при необходимости setsid, чтобы отделить его от его родителя) и , затем exec новый образ процесса.Разветвленный процесс будет заменен новым образом процесса, и родительский процесс останется живым.Посмотрите на waitpid, если вы хотите оставить родительский процесс открытым, пока дочерний процесс не выйдет.

РЕДАКТИРОВАТЬ: Для дальнейшего использования, да, setsid не является переносимым и семантика вокруг fork значительно различаются.Модель spawn-and-execute все еще существует практически на каждой платформе POSIX и не POSIX, даже если операционная система хоста явно не поддерживает POSIX.

0 голосов
/ 14 января 2012

DanieL -

Я согласен с ответом Бена (он даже получил мое возражение), потому что именно на это я и ответил бы.

Однако, если вы хотите запустить определенный браузер,или, другими словами, конкретное приложение, затем просто вызовите CreateProcess API.

Внимательно прочитайте документацию MSDN.Это сложный API, чтобы получить право.Пример кода здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx

...