首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >exec如何改变exec程序的行为

exec如何改变exec程序的行为
EN

Stack Overflow用户
提问于 2010-03-23 04:08:47
回答 5查看 343关注 0票数 7

我正在追查一起非常奇怪的撞车事故。它的奇怪之处在于有人发现了一个我无法解释的变通方法。

解决办法是这个小程序,我称之为“runner”:

代码语言:javascript
复制
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    if (argc == 1)
    {
        fprintf(stderr, "Usage: %s prog [args ...]\n", argv[0]);
        return 1;
    }

    execvp(argv[1], argv + 1);

    fprintf(stderr, "execv failed: %s\n", strerror(errno));

    // If exec returns because the program is not found or we
    // don't have the appropriate permission
    return 255;
}

正如您所看到的,这个程序所做的就是使用execvp将其自身替换为一个不同的程序。

从命令行直接调用程序时,程序会崩溃:

代码语言:javascript
复制
/path/to/prog args  # this crashes

但当它通过我的runner填充程序间接调用时,它工作得很好:

代码语言:javascript
复制
/path/to/runner /path/to/prog args   # works successfully

对于我来说,我可以弄清楚额外的exec如何改变正在运行的程序的行为(正如您所看到的,该程序不会改变环境)。

关于坠机的一些背景资料。崩溃本身发生在C++运行时。具体地说,当程序执行throw时,崩溃版本错误地认为没有匹配的catch (尽管有),并调用terminate。当我通过runner调用程序时,异常被正确捕获。

我的问题是,为什么额外的exec会改变exec‘’ed程序的行为?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-23 05:07:38

运行者加载的.so文件可能导致运行者正常工作。尝试ldd每个二进制文件,看看是否有库加载了不同的版本/位置。

票数 3
EN

Stack Overflow用户

发布于 2010-03-23 09:35:17

也许被调用的程序存在内存泄漏。尝试使用valgrind或其他内存检查工具运行它。发生内存错误后,其他一切都是未定义的行为(因此一切都可能发生)。

票数 1
EN

Stack Overflow用户

发布于 2010-03-23 04:55:10

在黑暗中,双exec可能会改变环境变量在RAM中的顺序。

环境是一个带有指针的内存结构;内核将该结构复制到新进程的地址空间中。在复制过程中,RAM中元素实际顺序可能会改变(环境变量没有语义上的顺序,但RAM中的地址有顺序)。使用两个exec(),可以修改顺序两次。

改变RAM中字符串的顺序会发现一个bug,这有点奇怪,但更奇怪的事情已经发生了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2495348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档