gpt4 book ai didi

c - Execvp 没有在循环中执行 n 次

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:46 24 4
gpt4 key购买 nike

假设输入是指向数组的指针,它在每个元素存储位置 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,我将它传递给 execvp将整个 cat sample.txt(即 input[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(first, input) 但这也不起作用。

最佳答案

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

execvp() 主要是为了由子进程调用,在你的情况下,对于 'n' 次 execvp() 调用,必须有 neen 'n' 个子进程 fork ,

良好做法:

  • 将 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);
}

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com