CPP运行外部程序,等到它完成并返回重新编码

时间:2013-11-04 12:07:23

标签: c++

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

system("");

但这次需要的是:

  • 返回该程序的代码
  • 在执行的程序运行时应用程序

因此,伪代码在完美实现中看起来像这样:

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

   ExecuteTask(m_strBinaryName);

   while(Task_Executing)
   {
     HeartBeat();
   }

   return m_iReturnCode;
}

只是为了澄清,我在 Unix 平台上运行它。

这里有什么选择,popen / fork? 任何人都有一个好的解决方案已经运行,并且可以对此有所了解吗?

感谢您对此的任何意见。

3 个答案:

答案 0 :(得分:1)

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

对于返回代码,您甚至可以从system()调用获取返回代码:

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

答案 1 :(得分:1)

我正在使用linux系统,提升线程和管道来执行命令并获得结果(如果你不知道boost你当然应该看看它。)

我发现提示在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;
}

答案 2 :(得分:0)

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

您也可以通过编写全局变量而不是共享文件来执行此操作。

但是,我会使用共享文件或全局变量进行操作或线程化,并且我不完全确定它会以这种方式工作。