C++ CPP正在运行外部程序,等待它完成并返回retcode

C++ CPP正在运行外部程序,等待它完成并返回retcode,c++,C++,好的,作为Lib的一部分,我需要一个“Worker”应用程序来运行外部程序。 通常我会打电话给: system(""); 但这一次需要的是: 该程序的返回代码 应用程序在执行的程序运行时工作 因此,在完美的实现中,伪代码将如下所示: CTask::Run() { m_iReturnCode = -1; ExecuteTask(m_strBinaryName); while(Task_Executing) { HeartBeat(); }

好的,作为Lib的一部分,我需要一个“Worker”应用程序来运行外部程序。 通常我会打电话给:

system("");
但这一次需要的是:

  • 该程序的返回代码
  • 应用程序在执行的程序运行时工作
因此,在完美的实现中,伪代码将如下所示:

CTask::Run()
{
   m_iReturnCode = -1;

   ExecuteTask(m_strBinaryName);

   while(Task_Executing)
   {
     HeartBeat();
   }

   return m_iReturnCode;
}
我只是想澄清一下,我是在Unix平台上运行的

我的选择是什么,波本/福克? 任何人都有一个很好的解决方案已经在运行,并可以在这方面透露一些信息,请


感谢您对此的任何输入。

您可以使用fork()创建fork()(如果需要线程,也可以使用clone()),然后在一个进程中使用execve()或system()运行程序,在另一个进程中继续运行原始程序

对于返回代码,您甚至可以通过以下方式从
system()
调用中获取返回代码:

ret = system("<your_command>");
printf("%d\n", WEXITSTATUS(ret));
ret=system(“”);
printf(“%d\n”,WEXITSTATUS(ret));

必须有某种进程间或线程间通信。如果您不想分叉或使用线程,可以尝试使用共享文件。打开要写入子任务的文件(由
system()
调用),完成后,写入一些值(例如“finished”)并关闭该文件。在父任务中,单击heartbeat,直到从共享文件中读取“finished”

您也可以通过编写全局变量而不是共享文件来实现这一点


但是,我会使用共享文件或全局变量对其进行加密或线程化,这很容易出错,我不完全确定它是否能够正常工作。

我使用的是linux系统、boost for threading和管道来执行命令并获得其结果(如果您不知道,您当然应该查看一下)

我在stackoverflow上找到了使用管道的提示,但很抱歉,我不再知道确切的问题

我不添加外部线程代码。只需在自己的线程中启动方法
execute

std::string execute()
{   
std::string result;

// DO NOT INTERRUPT THREAD WHILE READING FROM PIPE
boost::this_thread::disable_interruption di;

// add echo of exit code to command to get the exit code
std::string command = mp_command + "; echo $?";

// open pipe, execute command and read input from pipe
FILE* pipe = popen(command.c_str(), "r");
if (pipe)
{
    char buffer[128];
    while (!feof(pipe))
    {
        if (fgets(buffer, 128, pipe) != NULL)
        {
            std::string currBuffer(buffer);
            result += currBuffer;
        }
    }
}
else
{
    mp_isValid = false;
}

// sleeping busy wait for the pipe to close
while (pclose(pipe) == -1)
{
    boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}

return result;
}

您可能想要分叉它或者在单独的线程中运行任务。我已经考虑到了这一点,将等待更多的建议,看看这里还可以做些什么。谢谢你,这听起来像个计划!完美的看起来只有$nix,Windows呢?