linux — динамическое выполнение и завершение внешних программ с помощью переполнения стека

Мне нужно выполнять процессы, оставаясь под контролем каждого процесса.
Я хочу создать класс, в котором будут храниться потоки или pids или все, что для этого необходимо.

В настоящее время у меня есть программа, которая выполняет одно внешнее приложение с функцией C execvp, а также загружает среду из сценария оболочки. Так что моя текущая программа блокирует. Но мне нужно иметь возможность поддерживать его в рабочем состоянии, и только к тому времени, когда я завершу работу запущенного в данный момент или запустлю новое внешнее приложение.

Мой текущий подход заключается в создании потока, который использует функцию execve. Но тогда поток будет блокировать, насколько я вижу.

Код, который может быть в потоке (с переменными тогда):

char *argv[] = { "/bin/bash", "-c", "myApplication", 0 };
execve(argv[0], &argv[0], environment.data());

Вызываемые приложения, вероятно, не зафиксированы в коде, их имена будут заданы внешним установочным файлом, включая параметры.

Теперь мой актуальный вопрос, есть ли лучший способ «управлять» внешними приложениями, подобными этому, в c ++? Некоторое готовое решение (класс, библиотека)? И если нет, то как мне прекратить поток, если это фактический путь. Использование терминального вызова считается плохой практикой, это то, что я часто читаю.

Я надеюсь, что теперь это достаточно конкретно для форума, потому что я не знаю, как получить более конкретную информацию. Если вам нужно больше подсказок, что я хочу создать здесь, не стесняйтесь спрашивать в комментариях.

Обновить:

в DBus & другие:

Дополнительная информация Я не написал все процессы, которые я хочу запустить!
Так что он будет использоваться для запуска сторонних приложений, которые, даже если у меня есть код, делают не хочу изменить.

1

Решение

Вы хотите fork() прежде чем вы исполняете fork() это функция, которая создает новый процесс идентичный первоначальному абоненту fork() работает как подпроцесс. Разница в том, что родительский процесс получает pid ребенка в качестве возвращаемого значения, а ребенок получает 0. Суть того, что вы хотите сделать, заключается в следующем:

pid_t pid = fork();

if( pid == 0 )
{
// we're the child process
char *argv[] = { "/bin/bash", "-c", "myApplication", 0 };
int rc = execve(argv[0], &argv[0], environment.data());
// execve only returns if there was an error
// check 'errno' and handle it here
}
else if ( pid < 0 )
{
// pid is less than zero, we didn't successfully fork,
// there is no child process.
throw "error message";
}

// do whatever processing the parent does

Больше информации Вот. kill() Функция сама по себе не плохая практика, если вы хотите быстро и изящно завершить подпроцесс, который вы Можно написать обработчики сигналов в нем, но вы должны использовать что-то вроде DBus или же ZeroMQ сделать правильное межпроцессное взаимодействие. Вы хотите сказать программе что-то сделать, а не просто сказать ей умереть (обычно то, что вы хотите, чтобы она делала, если вы ее убиваете).

3

Другие решения

НИКОГДА НЕ ИСПОЛЬЗОВАТЬ execv функции в потоках потому что системный вызов execve () перекрывает текущий процесс изображение с новым процессом изображения.

Правильный шаблон, если fork-exec или лучше vfork-exec. Выдержка из справочной страницы:

Системный вызов vfork () может использоваться для создания новых процессов без полного
копирование адресного пространства старого процесса, что ужасно неэффективно в выгружаемой среде. Это полезно, когда цель fork (2)
было бы создать новый системный контекст для execve (2).
Системный вызов vfork () отличается от fork (2) тем, что ребенок заимствует
память родителя и поток управления до вызова execve (2) или
выход (либо путем вызова _exit (2), либо ненормально). Родительский процесс
приостановлено, пока ребенок использует его ресурсы.

С помощью vfork вскоре с execveвы избегаете копирования исходного образа процесса и не удаляете его с помощью нового процесса, поэтому исходный процесс имеет pid своего дочернего элемента, и cat контролирует его, смотрит, закончился ли он, отправляет ли ему сигналы и так далее.

3

По вопросам рекламы [email protected]