好吧,作为我的Lib的一部分,我需要一个'Worker'应用程序来运行外部程序。 通常我会打电话给:
system("");
但这次需要的是:
因此,伪代码在完美实现中看起来像这样:
CTask::Run()
{
m_iReturnCode = -1;
ExecuteTask(m_strBinaryName);
while(Task_Executing)
{
HeartBeat();
}
return m_iReturnCode;
}
只是为了澄清,我在 Unix 平台上运行它。
这里有什么选择,popen / fork? 任何人都有一个好的解决方案已经运行,并且可以对此有所了解吗?
感谢您对此的任何意见。
答案 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()
调用),完成后,写一些值(例如“完成”)并关闭文件。在父任务中,心跳直到您从共享文件中读取“已完成”。
您也可以通过编写全局变量而不是共享文件来执行此操作。
但是,我会使用共享文件或全局变量进行操作或线程化,并且我不完全确定它会以这种方式工作。