Execvp有三个元素

时间:2015-03-11 16:11:46

标签: c execvp

我正在尝试执行以下操作:

execvp(command[0][0], argument[0], '&');

当它不处于后台模式时,它会起作用,也就是说:

execvp(command[0][0], argument[0]);

是否有必要创建一个额外的数组来连接字符&到argument的末尾,还是有其他方法在execvp命令的末尾插入后台选项?

2 个答案:

答案 0 :(得分:0)

回答您的问题:

如果要传递额外的参数,则需要连接到数组。这可能意味着构建一个新阵列。使用memcpy()的考生在复制时可以让生活更轻松。

但是要找到你想要的东西(在后台运行)

使用此功能无法在后台模式下执行某些操作。 execvp用命令(第一个参数)替换整个过程映像。

示例摘自:http://www.cs.ecu.edu/karl/4630/sum01/example1.html

如果你想在后台运行一些东西,你需要先分叉:

int runcmd(char *cmd)
{
  char* argv[MAX_ARGS];
  pid_t child_pid;
  int child_status;

  parsecmd(cmd,argv);
  child_pid = fork();
  if(child_pid == 0) {
    /* This is done by the child process. */

    execvp(argv[0], argv);

    /* If execvp returns, it must have failed. */

    printf("Unknown command\n");
    exit(0);
  }
  else {
     /* This is run by the parent.  Wait for the child
        to terminate.  If you want to run in the background then 
        you could remove this code.  It's equivalent to "wait" 
        on the shell. */

     do {
       pid_t tpid = wait(&child_status);
       if(tpid != child_pid) process_terminated(tpid);
     } while(tpid != child_pid);

     return child_status;
  }
}

答案 1 :(得分:0)

execvp()函数正好需要两个参数,即要执行的二进制文件的名称和一个NULL终止的命令参数指针数组。传递更多或更少的参数会导致未定义的行为。传递与预期类型不同的类型的参数可能会编译,但可能没有您想要的结果。

所以是的,如果你想获取一个现有的参数数组并添加另一个参数,那么你需要为一个额外的元素创建一个带空格的副本。另请注意,'&'是char文字,而不是字符串文字。区别是巨大的。

尽管如此,我观察到,正如其他人所做的那样,给予"&"作为程序的参数将具有在后台运行程序的结果,更一般地说execvp()和其他exec-family函数可能没有你期望的行为。特别要注意,exec函数通常不会返回。通常,首先是一个fork(),然后在子进程中执行exec,这本身就提供了后台进程行为。

或者,您可能会发现system()函数更方便,因为它使用shell来运行您指定的命令。