По моему мнению, всегда следует избегать системной функции: она ненадежна, поскольку вы не знаете, какая оболочка будет обрабатывать вашу команду, и у нее нет средств, чтобы вернуть вам однозначный код ошибки. Более того, на платформах, таких как 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.