我试图在C ++中调用另一个应用程序。嵌入式应用程序由于输入文件的语法错误而受到分段错误,因此外部程序将负责重新运行内部和记录失败。
我的直接想法是依靠内部程序的返回值。所以我开始尝试这个。我在Inner.cpp
中写了一个虚拟程序:
#include <iostream>
int main()
{
std::cout << "Inner" << std::endl;
return 22;
}
然后,我在Outer.cpp
中写了这个:
#include <cstdlib>
#include <iostream>
int main()
{
int retval = system("~/Inner");
std::cout << "Returned: " << retval << std::endl;
return 0;
}
得到了令人困惑的输出:
Inner
Returned: 5632
所以我开始阅读。我很快发现,只有8个LS位通过,这些位经过无符号处理。但是,这不仅意味着不使用255以上的值吗?为什么我会得到这个奇怪的价值?
所以我开始查看这些内容。
What I expected: 22 -> 0000 0000 0000 0000 0000 0000 0001 0110
What I got: 5632 -> 0000 0000 0000 0000 0001 0110 0000 0000
哇,这是相同的模式,只是转移了。事实上,当我修改我的行时:
std::cout << "Returned: " << (retval >> 8) << std::endl;
我总是得到我想要的确切数字。但是,我无法找到发生这种情况的原因,现在我担心,当我到达我需要检测到SIGSEGV的部分时,会有更多的惊喜。内部程序,并继续在外部执行。
我的问题最终是:什么是将一个(命令行)应用程序安全地嵌入到另一个应用程序中的最佳方法,考虑到他们需要传达一些最小数据,而被调用的那个可能最终会出现segfaulting?
(另外,这个具有返回值的位移物是什么?)
Ubuntu 12.04.4 LTS
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
答案 0 :(得分:2)
您想使用fork
,exec
和wait
,例如:
int status;
if ((pid = fork()) == 0) // child proc
exec("~/Inner");
else // parent
waitpid(-1, &status, 0)
答案 1 :(得分:1)
使用WEXITSTATUS
int retval = system("~/Inner");
retval = WEXITSTATUS(retval);
会做