Я ищу способ базового управления процессами кроссплатформенным способом на C ++, но я не могу использовать внешние библиотеки (например, boost :: process). Сценарий таков - я вызываю дочерний процесс с помощью std :: system, теперь, если родительский процесс прерывается сигналом, мне нужно убить дочерний процесс перед выходом, чтобы не оставить его как зомби. Я читал об обработке сигналов, но не уверен, как убить процесс, созданный с помощью std :: system в функции handle. Есть ли другой / лучший способ сделать это?

c++
3
Vlad Keel 21 Апр 2016 в 13:47

2 ответа

Лучший ответ

C ++ недавно получил семантику для потоковой передачи, но не имеет (пока?) Семантики для процессов. Следовательно, он не предоставляет никаких средств для завершения процесса, запущенного в вашей системе.

Поэтому единственный жизнеспособный подход состоит в том, чтобы позволить родительскому процессу посылать какой-либо сигнал дочернему процессу и заставить дочерний процесс завершать себя при получении сигнала. Есть несколько способов сделать эту сигнализацию (например, через сигналы ОС, через стандартные примитивы IPC, через сеть), но стандартный C ++ не обеспечивает переносимого механизма для большинства из них. Следовательно, вы в конечном итоге выберете использование внешней библиотеки (например, Boost, Qt и т. Д.) Или ограничите свою реализацию набором поддерживаемых систем (например, ОС POSIX, и в этом случае вы даже можете напрямую вызвать {{ X0}}).

2
Claudio 21 Апр 2016 в 10:55

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

// For both OS X and iOS
#ifdef __APPLE__
   // includes or code
#endif

// For Windows:
#ifdef __MINGW32__
   // includes or code
#endif    

// For Linux:
#ifdef __linux__
  // includes or code
#endif

Вот еще решения: Как определить платформу / компилятор из макросов препроцессора?

1
Community 23 Май 2017 в 11:52