Execvp没有在循环中执行n次

时间:2013-03-07 01:53:29

标签: c

假设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(首先是输入),但是也没用。

3 个答案:

答案 0 :(得分:2)

以下是the opengroup exec manual在第一段中所说的内容:

  

成功的执行官不会有回报,因为这是召唤   过程映像被新过程映像覆盖。

我建议阅读the opengroup fork manual,并结合使用fork和exec。

答案 1 :(得分:1)

exec 使用exec替换正在运行的进程,因此它永远不会在success上返回,因为该进程将被替换。

如果要运行一堆进程,最简单的方法是使用popensystem之类的实用程序函数来运行它们。要获得完全控制,请对要运行的每个命令使用通常的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);
}