execve:如何使用多个命令而不是单个命令初始化char*argv []?

Lin*_*ker 5 c linux posix pid

execve:如何*argv[ ]使用多个命令而不是单个命令初始化char ?
如果我想执行4个命令,我可以使用以下语句吗?

char *argv[4][ ] = { {...}, {...}, {...} };
Run Code Online (Sandbox Code Playgroud)

要使用execve执行它们,我可以使用1到4的var的循环吗?

And*_*ing 4

您无法仅通过一次execve调用来执行多个命令。在循环中,您fork的程序将需要执行多个execve调用。在execve 的联机帮助页中写道:

execve() 成功后不会返回,并且调用进程的文本、数据、bss 和堆栈将被加载的程序的文本、数据、bss 和堆栈覆盖。[...]

返回值
成功时,execve() 不返回,错误时返回 -1,并适当设置 errno。

使用fork的方法:

输出:

Hello 1
Hello 2
Hello 3
Run Code Online (Sandbox Code Playgroud)

代码:

#include <unistd.h>
#include <stdio.h>

int main(void)
{
   int idx;
   char *argv[][4] = { {"/bin/sh", "-c", "echo Hello 1", 0},
                       {"/bin/sh", "-c", "echo Hello 2", 0},
                       {"/bin/sh", "-c", "echo Hello 3", 0} };
   for (idx = 0; idx < 3; idx++)
   {
      if (0 == fork()) continue;
      execve(argv[idx][0], &argv[idx][0], NULL);
      fprintf(stderr, "Oops!\n");
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用命令连接的方法:
解决方法是使用 shell 连接命令:

输出:

Hello 1
Hello 2
Run Code Online (Sandbox Code Playgroud)

代码:

#include <unistd.h>
#include <stdio.h>

int main(void)
{
   char *argv[] = {"/bin/sh", "-c", "echo Hello 1 && echo Hello 2", 0};
   execve(argv[0], &argv[0], NULL);
   fprintf(stderr, "Oops!\n");

   return 0;
}
Run Code Online (Sandbox Code Playgroud)