gpt4 book ai didi

c - 在 main() 之外访问进程的参数

转载 作者:行者123 更新时间:2023-12-04 01:50:49 25 4
gpt4 key购买 nike

是否可以在 main 函数之外的其他地方访问进程的参数?

我处于无法在 main 函数中添加代码的情况。一个测试软件为我创建了一个测试驱动程序,我只能在测试驱动程序的特定部分(不是主要功能)中添加代码。我想在这段代码中更改进程参数(准确地说,我想在 fork 之后更改进程名称……)

最佳答案

除了在 main() 的入口处保存它之外,没有可移植的方法来访问 argv 的值,这在问题的条件下是不可能的。

但是,基于初始堆栈的预期布局,大多数操作系统都存在非可移植解决方案。例如,以下应该在 Linux 上工作(但不保证,既不明确也不暗示):

#include <stdint.h>
/* This code is unsafe and unportable. But it might work for you. */
char** getargv(void) {
extern char** environ;
char **argv = environ - 1;
for (char** e = argv; (uintptr_t)(argv[-1]) != e - argv; --argv) { }
return argv;
}

该代码来自对创建的堆栈进行逆向工程 here .它假定 environ 仍然具有启动时分配的值,如果应用程序在此函数之前调用了 setenvputenv 则情况可能并非如此叫做。 (不过这种情况很少见。)作为引用,堆栈的相关部分如下所示(所有条目都是指针的大小):

argc
argv[0]
...
argv[argc - 1]
0
environ[0]
...
0

循环从终止 argv 数组的 NULL 开始,然后向后查找,直到遇到一个整数,该整数是 argc 的正确值。它可能会被一个看起来像整数的地址所愚弄,但在 Linux 中这种情况极不可能发生,因为用于 argv 字符串的地址永远不会小到足以与小整数混淆。


上面的代码是作为函数编写的,但在问题的上下文中可能是不可能的。显然,它可以复制到其他函数中,所以这不是问题。

但是,如果您能够将一个函数和一个全局变量插入到可执行文件中,您可以利用构造函数的常用(但不是通用的)实现,使用 GCC/Clang constructor功能属性。任何此类函数都在调用 main() 之前执行,并传递与传递 main() 相同的参数。这应该至少适用于 Linux 和 OS X,并且很可能适用于其他类 Unix 系统:

char** saved_argv;
int saved_argc;
void saveargv(int argc, char** argv) __attribute__((constructor)) {
saved_argc = argc;
saved_argv = argv;
}

关于c - 在 main() 之外访问进程的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53175556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com