【发布时间】:2012-09-16 23:12:25
【问题描述】:
我正在做一个与strace(1) 基本相同的项目,使用ptrace()。基本上我们有一个controller.c 程序,它接受一个可执行文件作为参数,并输出可执行文件所做的任何系统调用(例如% controller ls -l)
我们正在使用execve() 来运行可执行文件,但我们遇到了一些麻烦。 execve 接受以下参数
execve( const char *filename, char *const argv[], char *const envp[] )
这里的文件名是"ls",argv[] 是给定文件名的参数列表。所以我们有一些看起来像这样的东西(在 C 文件中)
int main(int argc, char *argv[],char *envp[]){
pid_t child;
child = fork;
if(/* CHILD */){
ptrace(PTRACE_TRACEME,0, NULL, NULL);
if(argc == 2) {
execve(argv[1],NULL,envp);
}
else {
execve( argv[1], /* ARGUMENT LIST */, envp);
}
} else /* PARENT */ {
//PARENT CODE
}
}
所以如果我们得到一个可执行文件,例如controller ls -l、where argv[0] = "controller"、argv[1] = "ls" 和argv[2] = "-l",我们如何才能在“ARGUMENT LIST”中传递正确的参数(在这种情况下,参数只是"-l" 但可能更多)?
基本上,我们如何初始化const char * 类型的数组,以使该数组具有可执行文件的参数值?我们是否甚至需要担心数组中有额外的值并且刚刚超过 argv 的 ARGUMENT LIST?
感谢您的帮助!
【问题讨论】:
-
我不太会使用 C。这种语法是否适用于获取某个数组的子数组? (我要试一试)
-
首先,你根本不需要那个内部的
if/else,其次,为什么不把&argv[1]作为execve的中间参数? -
argv + n只是一个指向 argv 的nth 元素的数组/指针。相当于&argv[n]。
标签: c exec constants ptrace execve