我正在做一个与strace(1)
使用ptrace()
. 基本上,我们有一个 controller.c 程序,它接受一个可执行文件作为参数,它输出可执行文件所做的任何系统调用(例如% controller ls -l
)我们正在使用execve()
来运行可执行文件,但是我们遇到了一些麻烦。execve 采用以下参数
execve( const char *filename, char *const argv[], char *const envp[] )
其中 filename 在这种情况下是"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?
谢谢你的帮助!