Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > fork() и exec() для билдера


Автор: froex 13.5.2009, 20:05
В линуксе есть функция fork() для создания копии процесса. Также есть функция exec() для замены процесса другим. Есть ли эквиваленты этих функций в C++ Builder?

Автор: froex 13.5.2009, 21:10
Нашел CreateProcess - сейчас буду испытывать, то или не то (описание функции в msdn).

Автор: mrbrooks 14.5.2009, 08:15
froex, камрад - когда говоришь Билдер - подрузамеваем VCL. В VCL - я не встречал функций требуемых тебе. Ибо они есть в WinAPI.
CreateProcess - одна из них - пожалуй это самый лучший для тебя вариант.

Есть еще ShellExecute, WinExec.
Не стоит забывать и про стандартную system.


Автор: froex 14.5.2009, 08:47
А как мне лучше организовать следующее: Запускаю консольное приложение. Оно запускает исполняемый файл VCL-приложения. Но сама консоль еще работает. Когда закрывается VCL-приложение, то консольное приложение не должно закрываться, а когда закрывается консольное приложение, то запущенное VCL-приложение закрывается, если есть.

Т.е. для обмена сообщениями мне надо хранить pid созданного процесса. В линуксе все просто: pid=fork(), далее сверяем и т.п. Если порожденный процесс, то заменял его с помощью exec().

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

Автор: Dmi3ev 14.5.2009, 08:56
Когда закрывается VCL-приложение, то консольное приложение не должно закрываться,
Цитата

ShellExecute

Автор: mrbrooks 14.5.2009, 08:58
froex, Однозначно использовать CreateProcess. Внимательно почитай про эту функцию. Информации в нете полно.


Автор: Dmi3ev 14.5.2009, 09:02
посмотри тут еще, там есть про pid
http://licrym.org/samouch/7/03/index.html

Добавлено через 1 минуту и 46 секунд
Цитата

froex, Однозначно использовать CreateProcess. Внимательно почитай про эту функцию. Информации в нете полно.

да, там флагов полно, помнится...

Автор: mrbrooks 14.5.2009, 09:07
Цитата(Dmi3ev @  14.5.2009,  09:02 Найти цитируемый пост)
да, там флагов полно, помнится... 

не так страшен черт - как его малюют.  smile матчасть надо знать.

Автор: froex 14.5.2009, 10:04
Как приду домой, то почитаю smile все никак до документации по этим функциям не доберусь

Автор: xvr 14.5.2009, 11:46
Цитата(froex @ 14.5.2009,  08:47)
А как мне лучше организовать следующее: Запускаю консольное приложение. Оно запускает исполняемый файл VCL-приложения. Но сама консоль еще работает. Когда закрывается VCL-приложение, то консольное приложение не должно закрываться, 

Это получится автоматом
Цитата

а когда закрывается консольное приложение, то запущенное VCL-приложение закрывается, если есть.

А это надо делать.
Нужно сообщить VCL приложению, что консольное закрылось. Есть 2 варианта:
  •  Консольное приложение явно говорит всем запущенным VCL приложениям, что оно собирается закрыться (например через именованный Event, см. CreateEvent и OpenEvent). В VCL приложении нужно создать TThread, который будет ждать Event'а, после чего делать Close главной формы (через Synchronize)
  •  Другой вариант сообщить о закрытии - найти окно VCL приложения и послать ему WM_CLOSE
  •  Альтернатива - VCL приложение получает Process ID консольного (GetCurrentProcessId) параметром и мониторит, что процесс с этим ID существует (OpenProcess). Как процесс закончился, VCL приложение закрывается
Первый вариант имеет недостаточ, что если консольный процесс сломается, то VCL'ный об этом не узнает


Автор: mrbrooks 14.5.2009, 13:12
а не проще ли - зная дескриптор дочернего процесса (благодаря PROCESS_INFORMATION)  вызвать TerminateThread и спокойно завалить этого мерзавца?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)