使用execvp读取命令行参数作为命令错误

问题描述

Linux的新手,我试图在Linux操作系统中读取命令行参数。我希望能够以编程方式执行作为命令行参数给出的命令。这是我到目前为止的内容

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char* argv[])
{
    int counter;
    
    for(counter = 1; counter < argc; counter++){
        
        pid_t pid = fork();
        if(pid < 0)
        {
            perror("Forking Failed");
            exit(1);
        }
        else if(pid == 0)
        {
            char *args[] = {argv[counter],NULL};
            printf("Argument to be passed: %s \n",argv[counter]);
            execvp(args[0],args);
            perror("Command Failed.");
            exit(0);
        }

        printf("Process %s completed successfully.\n",argv[counter]);
    }
    exit(0);
    
}

我在终端上的输出

darren@darren-VirtualBox:~/Desktop$ ./cmdarguments /home/darren/Desktop/fullpathdoc1 /home/darren/Desktop/fullpathdoc2
Process /home/darren/Desktop/fullpathdoc1 completed successfully.
Process /home/darren/Desktop/fullpathdoc2 completed successfully.
darren@darren-VirtualBox:~/Desktop$ Argument to be passed: /home/darren/Desktop/fullpathdoc2 
This is the second program that simply prints this statement. 
Argument to be passed: /home/darren/Desktop/fullpathdoc1 
This is the first program that simply prints this statement.

我希望能够打印出进程名称,并说在成功执行每个命令行参数之后,该进程已完成。由于某种原因,我的输出导致所有内容似乎都向后执行,我的进程完成的消息首先出现,并且从右向左读取命令行。有人可以帮忙我的代码吗,我该如何纠正?

解决方法

当有多个进程时,哪个进程首先运行完全取决于您的操作系统(Linux)。

,

广泛地说,父进程-fork()返回> 0的地方-需要等待子进程完成。请记住,对execvp()的三个调用会导致三个并行的进程。因此,如果您不监视它们,它们将以他们自己的方式进行。已经在SO上对此问题进行了讨论:

how to correctly use fork,exec,wait