execve:如何*argv[ ]使用多个命令而不是单个命令初始化char ?
如果我想执行4个命令,我可以使用以下语句吗?
char *argv[4][ ] = { {...}, {...}, {...} };
Run Code Online (Sandbox Code Playgroud)
要使用execve执行它们,我可以使用1到4的var的循环吗?
您无法仅通过一次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)