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

我试图追查一次非常奇怪的事故。 奇怪的是有人发现了一个解决方法,我无法解释。

解决方法是这个小程序,我将其称为'跑步者':

#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: %sn", strerror(errno));

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

正如你所看到的,这个程序所做的一切就是使用execvp来替换它自己的一个不同的程序。

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

/path/to/prog args  # this crashes

但通过我的亚军垫片间接调用时效果很好:

/path/to/runner /path/to/prog args   # works successfully

在我的生活中,我可以弄清楚如何让一个额外的exec可以改变正在运行的程序的行为(正如你所看到的程序不会改变环境)。

关于崩溃的一些背景。 崩溃本身发生在C ++运行时。 特别是,当程序执行throw ,崩溃版本错误地认为没有匹配的catch(尽管存在)并且调用terminate 。 当我通过跑步者调用程序时,异常被正确捕捉。

我的问题是任何想法为什么额外的EXEC会改变执行程序的行为?


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


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


作为黑暗中的镜头:双重执行可能会改变RAM中环境变量的顺序。

环境是一个带指针的内存结构; 内核将该结构复制到新进程的地址空间中。 RAM中元素的实际顺序可能会在该副本期间发生更改(环境变量未按语义排序,但RAM中的地址有顺序)。 使用两个exec(),该订单可能会被修改两次。

RAM中字符串排序的变化发现了一个错误有点奇怪,但是奇怪的事情发生了。

链接地址: http://www.djcxy.com/p/45193.html

上一篇: how can exec change the behavior of exec'ed program

下一篇: Make the current commit the only (initial) commit in a Git repository?