Как создать процесс в C ++ под Linux?

Я хотел бы создать процесс, вызывая исполняемый файл, так же, как popen позволит. Но я не хочу на самом деле общаться с ним по каналу: я хочу управлять им, например отправлять туда сигналы или узнавать, работает ли процесс, дождаться его завершения после отправки. SIGINT и так далее, как multiprocessing в питоне работает. Как это:

pid_t A = create_process('foo');
pid_t B = create_process('bar');

join(B); // wait for B to return
send_signal(A, SIGINT);

Какой правильный путь?

Пример использования, например:

  • мониторинг группы процессов (например, перезапуск их при сбое)

ОБНОВИТЬ

Я вижу, в каком направлении идут ответы: fork(), Затем я хотел бы изменить свой вариант использования: я хотел бы создать класс, который принимает строку в конструкторе и задается следующим образом: Когда создается объект, запускается (под) процесс (и управляется экземпляр класса), когда вызывается деструктор, процесс получает сигнал завершения, и деструктор возвращается, как только процесс возвращается.

Сценарий использования сейчас: на диаграмме состояния форсирования запустите процесс при входе в состояние и отправьте завершение при выходе из состояния. Похоже, http://www.highscore.de/boost/process/process/tutorials.html#process.tutorials.start_child это то, что ближе всего к тому, что я ищу, за исключением того, что кажется устаревшим.

Разве это не возможно неинвазивным способом? Может быть, у меня есть фундаментальное недоразумение, и есть лучший способ сделать такую ​​работу, если так, я был бы рад получить некоторые подсказки.

ОБНОВЛЕНИЕ 2

Благодаря ответам ниже, я думаю, что я немного понял идею. Я думал, что этот пример напечатает «Это главное» три раза, один раз для «родителя» и один раз для каждого fork() — но это неправильно. Итак: Спасибо за терпеливые ответы!

#include <iostream>
#include <string>

#include <unistd.h>

struct myclass
{
pid_t the_pid;
myclass(std::string the_call)
{
the_pid = fork();
if(the_pid == 0)
{
execl(the_call.c_str(), NULL);
}
}
};

int main( int argc, char** argv )
{
std::cout << "This is main" << std::endl;
myclass("trivial_process");
myclass("trivial_process");
}

1

Решение

Используя ранее опубликованный код, попробуйте это:

#include <signal.h>
#include <unistd.h>

class MyProc
{
public:
MyProc( const std::string& cmd)
{
m_pid = fork()
if (pid == 0) {
execl(cmd.c_str(), cmd.c_str(), NULL);
}
}

~MyProc()
{
// Just for the case, we have 0, we do not want to kill ourself
if( m_pid > 0 )
{
kill(m_pid, SIGKILL);
wait(m_pid);
}
}
private:
pid_t m_pid;
}

Недостатком, который я вижу в этом примере, будет то, что вы не можете быть уверены, что процесс завершился (и, вероятно, он этого не сделает), если будет выдан сигнал, так как ОС будет продолжена сразу после уничтожения, а другой процесс может задержать его. ,
Чтобы убедиться в этом, вы можете использовать ps … с grep для pid, тогда это должно сработать.

Редактировать: я добавил ожидание, которое появляется в комментарии там!

1

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

Ниже приведен не совсем реалистичный код, но он дает вам некоторое представление.

pid_t pid = fork()
if (pid == 0) {
// this is child process
execl("foo", "foo", NULL);
}
// continue your code in the main process.
3

Посмотрите на fork() (man 2 fork)

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