1

所以这是我的代码片段:

pid_t children[MAX_PIPES];
for (i = 0; i < numPipes; i++)
{
    pid_t child_pid = fork();
    children[i] = child_pid;

    switch(child_pid)
    {
        case 0:
            // Some code thats executed in the child that executes execv()
            break;
        case -1: // Unable to create child
            perror("fork");
            break;
    }
}
// Wait for children 
for (j = 0; j < numPipes && children[j] != 0; j++)
{
    if (background)
        waitpid(children[j], &status, WNOHANG);
    else
        waitpid(children[j], &status, 0);
}

目前,当我只调用一次 execv() 时它工作正常,但我试图在已经分叉的子进程中一个接一个地使用 execv() 执行多个命令。

我该如何添加该功能?我试图在孩子内部的循环中添加另一个 fork() 但它没有成功。

任何想法将不胜感激。谢谢

4

2 回答 2

1

execv与其他exec()命令一样,除非失败,否则不会返回。新程序的上下文被加载以代替当前程序。

于 2013-04-10T20:55:50.053 回答
0

您的问题是execv用被调用的命令替换整个子进程,因此您不能将多个 execv 命令放入子进程中。

如果你想有多个命令,你必须fork()execv()每一个。您可以使用system(),但它不会以与execv()(它启动 shell)相同的方式处理参数。

如果你想运行多个命令,那么你应该做第二个fork()......execv()使用类似于:

int
subv(char *path, char * const argv[])
{
  int ret;
  pid_t a_pid = fork();
  if (a_pid == -1) return -1;
  if (a_pid != 0) { wait(&ret); return ret; }
  return execv(path, argv);
}

您将所有 execv 调用替换为 subv() 并适当地处理返回码。

于 2013-04-10T20:52:08.423 回答