Использование execvp, fork и wait для выполнения кодов в файле - PullRequest
0 голосов
/ 21 февраля 2020

Я использую execvp для выполнения unix команд, записанных в текстовом файле. Ниже приведен код, который я написал, но он не работает.
Я читаю строки из файла, и каждая строка содержит команду unix (mv, cp et c).

#include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include <unistd.h>
    int main ( int argc, char *argv[] )
    {   pid_t  pid;
        pid_t child_pid;
        int child_status;  
        char *token;    
        FILE *fp;
        fp = fopen(argv[1],"r");
        int i,j,ctr,rc_wait;
        if( fp == NULL){
            perror("An error has occurred\n");
            exit(1);
            }
        char buff[100];
        while(fgets(buff, sizeof(buff), fp)){    
            child_pid=fork();
            if(child_pid<0){
                printf("\nfork failed, error");
                exit(0);
            }
            else if(child_pid==0){
            //printf("\nString value = %s", buff);
            token = strtok(buff, " \t");
            execvp(token,buff);
            }
            else{
            rc_wait = wait(NULL);
            continue;
            }

            }   

            }
            return 0;
            }

входной файл был предоставлен в качестве аргумента для программы, и входные данные приведены ниже в качестве примера:

    cp temp1/f1.txt              temp2/
    mv temp1/f2.c                           temp2/
    cp temp1/f3.txt                temp2/
    cp temp1/f4.txt                temp2/
    cp temp1/f5.txt                temp2/
    cp temp1/f6.txt                 temp2/
    mv temp1/f7.c                   temp1/f8.c
    mv temp1/f9.c                   temp2/
    cp temp1/f1.txt              temp1/f1a.txt

1 Ответ

0 голосов
/ 21 февраля 2020

Вы неправильно используете strtok и execvp. Первая изменяет входную строку при ее вызове, поэтому после ее однократного выполнения она разделяется buff на NUL (token и buff фактически ссылаются на тот же адрес после первого вызова, хотя token изменится после дополнительной токенизации). Вы можете использовать strtok только для полного разбора ввода, если вы делаете копии каждого результата по мере его генерирования (например, с помощью strdup, если вы можете положиться на современные стандарты POSIX), потому что действителен только последний возвращенный указатель.

Ваше execvp использование также неправильно; вторым аргументом execvp является массив строк C в стиле char* s (сам массив завершается указателем NULL). Вы передали ему простой массив char (одна строка, а не их массив).

Пожалуйста, прочитайте страницы man для обоих API; Вы так далеко от цели, что ясно, что вы просто гадаете, как они работают.

...