假设输入是一个指向数组的指针,每个元素在0位置存储“ls-l”,然后在1位置存储cat helloworld.txt,依此类推,我希望创建主参数ls、cat、pwd并执行它。本质上,我所做的是我有一个包含所有这些命令的文件,我首先将它们存储在我的输入变量中,该变量声明为char*input[10]。现在我在这个数组中有了我需要的东西,并且我能够提取各个主命令,比如ls、cat,并且我希望执行所有这些命令。
例如,
如果位置0有ls-l,我的第一个变量有ls,我想把它传递给execvp,然后位置1可能有cat sample.txt,现在我的变量首先是cat,我把它和整个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(首先,输入),但也没用。

最佳答案

如果您使用execvp()一次,除了调用execvp的进程的pid之外,涉及的进程的执行上下文将被更改,因此您的循环将不会工作,因为一旦execvp(),就不会有更多的迭代。
execvp()主要由子进程调用,在您的例子中,对于'n'个execvp()调用,必须有neen'n'个子进程分叉,
良好做法:
对子进程使用execl、execv、execle、execve、execlp、execvp、系统调用系列。
在将新进程映像加载到子进程之后,并在执行之后,收集启动进程的退出代码,并执行任何必要的错误处理。
子进程现在处于僵尸状态,父进程必须退出WAITE()/WAITIPID(),并等待所有子进程终止,然后退出。
--编辑--
操作参考的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);
}

关于c - Execvp不在循环中执行n次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15261673/

10-11 23:01