Inn*_*per 5 c++ embedding segmentation-fault
我正在尝试用C++调用另一个应用程序.由于输入文件中的语法错误,嵌入式应用程序会受到分段错误的影响,因此外部程序将负责重新运行内部和记录失败.
我的直接想法是依靠内部程序的返回值.所以我开始尝试这个.我写了一个虚拟程序Inner.cpp:
#include <iostream>
int main()
{
std::cout << "Inner" << std::endl;
return 22;
}
Run Code Online (Sandbox Code Playgroud)
然后,我写了这个Outer.cpp:
#include <cstdlib>
#include <iostream>
int main()
{
int retval = system("~/Inner");
std::cout << "Returned: " << retval << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
得到这个令人困惑的输出:
Inner
Returned: 5632
Run Code Online (Sandbox Code Playgroud)
所以我开始阅读.我很快发现,只有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
Run Code Online (Sandbox Code Playgroud)
哇,这是相同的模式,只是转移.事实上,当我修改我的行时:
std::cout << "Returned: " << (retval >> 8) << std::endl;
Run Code Online (Sandbox Code Playgroud)
我总是得到我想要的确切数字.但是,我找不到任何关于为什么会发生这种情况的事情,而现在我担心的是,当我到达内部程序中需要检测SIGSEGV并继续执行的部分时,会有更多的惊喜在外面.
我的问题最终是:将一个(命令行)应用程序安全地嵌入另一个应用程序的最佳方法是什么,考虑到它们需要传递一些最小数据,而被调用的那个可能最终会出现segfaulting?
(另外,这个具有返回值的bithift东西是什么?)
Ubuntu 12.04.4 LTS
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Run Code Online (Sandbox Code Playgroud)
您想使用fork、exec和wait,例如:
int status;
if ((pid = fork()) == 0) // child proc
exec("~/Inner");
else // parent
waitpid(-1, &status, 0)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |