混淆嵌入式应用程序的返回值

时间:2014-05-15 12:17:40

标签: c++ segmentation-fault embedding

我试图在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

2 个答案:

答案 0 :(得分:2)

您想使用forkexecwait,例如:

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);

会做