Как разветвляться, ждать и убивать процессы независимо от платформы? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть код C, который использует fork() + exec(), wait() (или waitpid()) и kill() - и предполагает, что они существуют после включения соответствующих заголовков POSIX.

СейчасЯ хочу сделать этот код максимально мультиплатформенным - с минимальными изменениями .Таким образом, не нужно вводить сторонние библиотечные зависимости и не реализовывать эти средства в системах, в которых их нет.Тем не менее, для меня важно выйти за рамки только Linux, Windows и Mac OS.Мой инструмент для этого - CMake, который использует проект с этим кодом;и препроцессор CМожет быть, немного клеяного кода в собственном C.

Мой вопрос: что я должен проверить, что я должен поместить в сгенерированный включаемый файл, и как я должен изменить свой код, вызывая эти функции для того же эффектаповедение как на POSIX, так и на различных платформах, отличных от POSIX?

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

1 Ответ

0 голосов
/ 11 февраля 2019

Windows

Ну fork() (создать новый процесс) и exec() (запустить новую программу в этом процессе) не существует в Windows, просто и понятно.Вместо этого у вас есть CreateProcess, который объединяет два.

Затем вы можете использовать TerminateProcess, чтобы завершить процесс.

Затем можно реализовать два отдельных файла .c: один для Windows и один для систем, которые имеют fork() / exec().

POSIX

Если вы заботитесь только о переносимости черезСреды POSIX (Linux, BSD, Mac OS), тогда posix_spawn(), безусловно, путь.Он обрабатывает все тонкости обработки ошибок в дочернем процессе.

См. Также: возможность `posix_spawn`

Кроссплатформенные библиотеки

ТамВот несколько кроссплатформенных сред, решающих эту проблему для вас:

Они, конечно, решают и ряд других проблем с переносимостью, поэтому лучше всего «купить» и использовать каркас для всего, что вы делаетекоторый взаимодействует с системой.

...