C和execve(3)参数

时间:2012-09-16 23:12:26

标签: c exec const ptrace execve

我正在使用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 -lwhere argv[0] = "controller"argv[1] = "ls"argv[2] = "-l",我们如何在“ARGUMENT LIST”中传递正确的参数(这种情况下的参数只是"-l",但可能更多)?

基本上,我们如何初始化类型const char *的数组,以便数组具有可执行文件的参数值?我们是否甚至需要担心在数组中有额外的值,而对于ARGUMENT LIST只需要argv

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您只需传递argv + 1(跳过您的计划名称)即可。 argv + 1是一个指向数组的指针,该数组从argv的第二个元素开始,这是执行程序的名称。 argv + 1相当于&argv[1],您可以使用自己喜欢的任何风格。

如评论中所述,标准的第5.1.2.2.1节规定argv确实以空终止。保留以下部分是为了完整。

如果C不保证argv为空终止(并且我不清楚它是否存在),您可以这样做:

char **new_argv = malloc((argc-1) * sizeof(char*));
for (int i = 0; i < argc - 1) new_argv[i] = argv[i+1];

并使用new_argv作为参数列表。

答案 1 :(得分:1)

execve(argv[1], argv+1, envp);