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