2009-11-09 3 views
2

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

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

EDIT: Мне нужно дождаться его завершения, прежде чем продолжать делать что-то.

ответ

0

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

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

+0

Он открывает командную строку и выполняет там команду. Мне нужно подождать, пока он закончит, прежде чем продолжать делать что-то, поэтому я думаю, что это не устраивает мои нужды. Спасибо, в любом случае! – Jeff

+0

@Jeff - system() синхронно. Ваш pgm будет ждать, пока он не будет завершен. – Duck

0

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

+0

Qt кажется довольно большим проектом для того, что мне нужно, если я смогу связать статически с ним, будет ли разрастающийся исполняемый файл? И, похоже, он нацелен на разработку на C++, я делаю обычный C. – Jeff

+1

Я просто хочу указать, что начиная с версии 4.0 Qt был разбит на более мелкие куски, которые можно использовать, чтобы больше не было больших единственная зависимость. – supercheetah

+0

@Jeff, я согласен с суперхетами ... они сделали это, чтобы вы могли пропустить часть графического интерфейса, если вам это не нужно. Кроме того, если вы делаете несколько программ, вы можете распространять часть Qt в виде разделяемых библиотек или библиотек DLL и сохранять пространство таким образом. Однако он все еще довольно большой. Вы также можете рассмотреть boost.interprocess: http://www.boost.org/doc/libs/1_35_0/doc/html/interprocess.html –

1

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

Апач Portable Runtime является хорошим вариантом для написания переносимых программ низкого уровня в С.

3

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

 Смежные вопросы

  • Нет связанных вопросов^_^