0

假设输入是一个指向数组的指针,它在每个元素处存储,“ls -l”在位置 0,然后 cat helloworld.txt 在位置 1,依此类推,我希望创建主要参数,即 ls、cat、 pwd,然后执行。本质上,我正在做的是我有一个包含所有这些命令的文件,我首先将它们存储在我的输入变量中,该变量被声明为 char *input[10]。现在我在那个数组中有我需要的东西,我可以提取单个的主要命令,比如 ls、cat,我希望执行所有这些命令。

例如,

如果位置 0 有 ls -l,我的第一个变量有 ls,我希望将它传递给 execvp,然后位置 1 可能有 cat sample.txt,现在我的变量首先是 cat,我将它与整个传递给 execvp cat sample.txt(输入[i]),执行vp。由于某种奇怪的原因,这不起作用。如何在 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(first, input) 但这也不起作用。

4

3 回答 3

2

这是opengroup exec 手册在第一段中所说的:

成功的 exec 不会有任何返回,因为调用进程映像被新进程映像覆盖。

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

于 2013-03-07T01:56:28.453 回答
2

如果您使用 execvp() 一次,所涉及的进程的执行上下文将被更改,但调用 execvp 的进程的 pid 除外,因此您的循环将无法工作,因为一旦 execvp() ,将不会有任何更多的迭代。

execvp() 主要是由子进程调用,在您的情况下,对于 'n' 个 execvp() 调用,必须有新的 '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);
}
于 2013-03-07T02:05:41.707 回答
1

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

如果你想运行一堆进程,简单的方法是使用类似popensystem运行它们的实用程序函数。要完全控制,请对要运行的每个命令使用一次常用的 UNIX fork/组合。exec

于 2013-03-07T01:58:17.920 回答