Перезапустите программу дочернего процесса в C ++ Linux - PullRequest
0 голосов
/ 27 мая 2018

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

Вот тест, который демонстрирует, что я пытаюсь сделать.

Файл main.cpp:

#include <iostream>
#include <unistd.h>
#include <sys/ptrace.h>
#include "handler.h"

int main(int argc, char** argv)
{
    if (argc < 2)
    {
        std::cerr << "usage: program name" << std::endl;
        return 1;
    }

    pid_t pid = fork();

    if (pid == 0)
    {
        if (ptrace(PTRACE_TRACEME, 0, nullptr, nullptr) < 0)
            std::cerr << "ptrace error" << std::endl;
        else
            execl(argv[1], argv[1], nullptr); 
    }
    else if (pid >= 1)
    {
        Handler handler(std::string(argv[1]), pid);
        handler.run();
    }
}

Файл handler.h:

#include <stdio.h>
#include <unistd.h>
#include <string>
#include <sys/ptrace.h>
#include <sys/wait.h>

class Handler
{

private:
    pid_t m_pid;
    std::string m_name;
public:
    Handler(const std::string& name, pid_t pid) : m_name(name), m_pid(pid)
    {
    }

    void run()
    {
        std::string line;
        while (true)
        {   
            std::cout << "(command) ";
            std::getline(std::cin, line);

            if (line == "run")
            {
                int options = 0, status = 0;
                ptrace(PTRACE_CONT, m_pid, nullptr, nullptr);
                int pid = waitpid(m_pid, &status, options);

                // trying to restart again the program
                if (pid < 0)
                {
                    m_pid = fork();
                    execl(m_name.c_str(), m_name.c_str(), nullptr);
                }

            }
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...