J'ai utilisé execvp pour exécuter des commandes Unix écrites dans un fichier texte. Ci-dessous se trouve le code que j'ai écrit mais il ne semble pas fonctionner.
Je lis des lignes d'un fichier et chaque ligne contient une commande unix (mv, cp, etc.).

#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;
            }

Le fichier d'entrée a été fourni comme argument au programme et l'entrée contient ci-dessous à titre d'exemple :

    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
rohith p 21 févr. 2020 à 18:51

1 réponse

Meilleure réponse

Vous abusez de strtok et execvp. Le premier mute la chaîne d'entrée comme vous l'appelez, donc après qu'il s'est exécuté une fois, il est divisé buff par un NUL (token et buff se réfèrent en fait au même adresse après le premier appel, bien que token change après une tokenisation supplémentaire). Vous ne pouvez utiliser strtok pour analyser complètement l'entrée si vous faites des copies de chaque résultat tel qu'il est généré (par exemple via strdup si vous pouvez vous fier aux normes POSIX modernes), car seul le pointeur renvoyé le plus récemment est toujours valable.

Votre utilisation de execvp est également erronée ; le deuxième argument de execvp est un tableau de chaînes de style C, char*s (le tableau lui-même se terminant par un pointeur NULL). Vous lui avez passé un simple tableau de char (une chaîne, pas un tableau).

Veuillez lire les pages man pour les deux API ; vous êtes si loin du compte qu'il est clair que vous devinez simplement comment ils fonctionnent.

0
ShadowRanger 21 févr. 2020 à 16:02