假设input是一个指向数组的指针,在每个元素存储时,位置0处的“ls -l”,然后是位置1处的cat helloworld.txt,依此类推,我希望创建主参数,即ls ,猫,pwd,并执行它。基本上,我正在做的是我有一个包含所有这些命令的文件,我首先将它们存储在我的输入变量中,该变量被声明为char * input [10]。现在我在该数组中拥有我需要的东西,并且我能够提取各个主要命令,例如ls,cat,并且我希望执行所有这些命令。
例如,
如果位置0有ls -l,我的第一个变量有ls,我希望将它传递给execvp然后位置1可能有cat sample.txt,现在我的变量首先是cat,然后我将它传递给execvp用整个cat sample.txt(输入[i]),到execvp。由于一些奇怪的原因,这是行不通的。如何在execvp的循环中运行所有这些命令,这样一旦完成,所有这些命令都已成功运行。这是我的尝试,在第一个循环结束时,我运行一个execvp,我希望完成,然后我提取进一步的输入等等。
帮帮我。
for(i=0; i<lineCount; i++)
{
first = malloc(sizeof(char)*50);
for(j=0; j<strlen(input[i]); j++)
{
if(input[i][j]!=' ')
{
first[j]=input[i][j];
}
else
{
break;
}
}
execvp(first, input[i]);
}
我尝试过execp(首先是输入),但是也没用。
答案 0 :(得分:2)
以下是the opengroup exec manual在第一段中所说的内容:
成功的执行官不会有回报,因为这是召唤 过程映像被新过程映像覆盖。
我建议阅读the opengroup fork manual,并结合使用fork和exec。
答案 1 :(得分:1)
exec
使用exec
替换正在运行的进程,因此它永远不会在success
上返回,因为该进程将被替换。
如果要运行一堆进程,最简单的方法是使用popen
或system
之类的实用程序函数来运行它们。要获得完全控制,请对要运行的每个命令使用通常的UNIX fork
/ exec
组合。
答案 2 :(得分:1)
如果你使用execvp()一次,那么涉及的进程的执行上下文将被更改,除了调用execvp的进程的pid,因此你的循环将无法工作,因为一旦execvp(),就赢了不再是迭代了。
execvp()主要是由子进程调用,在你的情况下为'n'个execvp()调用,必须有neen'n'个子进程分叉,
良好做法:
使用execl,execv,execle,execve,execlp,execvp,系统调用系列,以及子进程。
将新进程映像加载到子进程后,执行后,收集已启动进程的退出代码,并执行任何必要的错误处理。
子进程现在处于僵尸状态,父进程必须执行wait()/ waitpid(),并等待所有子进程终止,然后退出。
- 编辑 - OP参考的POC代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
pid_t cpid;
int status = 0;
cpid = fork();
if (cpid == 0)
{
char *cmd[] = { "ls", "-l", (char *)0 };
int ret = execv ("/bin/ls", cmd);
}
wait(&status);
if(status < 0)
perror("Abnormal exit of program ls");
else
printf("Exit Status of ls is %d",status);
}