Использование 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.

Я хочу иметь возможность распечатать имя процесса и сказать, что процесс завершен после успешного выполнения каждого аргумента командной строки. По какой-то причине мой вывод приводит к тому, что все, кажется, выполняется в обратном порядке, причем сообщения о завершении моего процесса появляются первыми, а также читаются в командных строках справа налево. Может кто-нибудь помочь с моим кодом и как я могу это исправить?


person thedafferg    schedule 16.09.2020    source источник


Ответы (2)


Когда есть несколько процессов, какой процесс запускается первым, полностью зависит от решения вашей операционной системы (Linux).

person xwz7611    schedule 16.09.2020

В общих чертах, родительский процесс — здесь fork() возвращает > 0 — должен дождаться завершения дочернего процесса. Имейте в виду, что три вызова execvp() приводят к трем одновременным процессам. Так что, если вы не будете следить за ними, они будут продолжать свою веселую жизнь. На SO уже есть обсуждение этого вопроса:

как правильно использовать fork, exec, wait

person Kevin Boone    schedule 16.09.2020