在C ++ linux中重新启动子进程程序

时间:2018-05-27 20:21:24

标签: c++ linux process

我最近了解了进程和线程,我正在构建一个项目,我需要在子进程中运行程序。 问题是,在子进程中的程序退出后,我不知道如何重新启动并再次运行该程序。

这是一个测试,展示了我想要做的事情。

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);
                }

            }
        }
    }
};

0 个答案:

没有答案