Как я могу создать процесс в портативном режиме? - PullRequest
2 голосов
/ 10 ноября 2009

Я пытаюсь написать программу, которая должна создавать некоторые другие процессы. Я привык к Windows API, но теперь мне нужно, чтобы моя программа могла работать и на платформе Linux.

Можно ли сделать это портативным способом? Должен ли я использовать препроцессор для этой цели?

РЕДАКТИРОВАТЬ: мне нужно дождаться его окончания, прежде чем продолжать делать вещи.

Ответы [ 4 ]

3 голосов
/ 26 ноября 2009

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

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

int CreateProcess(const char * Executable, const char * CommandLine)
{
#if defined (_WIN32)
    return CreateProcess(Executable, CommandLine /* blah blah blah */)!=FALSE;
#elif defined (_POSIX)
    /* put here all the usual fork+exec stuff */
#else
    #error The CreateProcess function is not defined for the current platform.
#endif
}

Кстати, функция может быть легко расширена до блокировки, вы можете просто добавить флаг (int Blocking или все, что сейчас используется в C99 для логических значений), который будет вызывать WaitForSingleObject для раздела win32 и waitpid для раздела POSIX.

1 голос
/ 10 ноября 2009

API-интерфейсы разные, поэтому невозможно написать два куска кода или создать ссылку на библиотеку, которая делает то же самое.

Apache Portable Runtime - хороший вариант для написания переносимых низкоуровневых программ на языке C.

0 голосов
/ 10 ноября 2009

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

0 голосов
/ 10 ноября 2009

Попробуйте system (), поскольку она существует как в Posix, так и в Windows.

@ Jeff - system () является блокирующим вызовом, он не вернется, пока не завершится дочерний процесс.

...