2017-05-16 2 views
2

J'ai écrit ce code qui ouvre un fichier et exécute chaque ligne de fichiers eXept commentaire "#":Problèmes avec execvp() et/ou chaînes, pourquoi ce code ne fonctionne pas?

mon_fichier:

ls -l 
ls -a 
cat /tmp/filex 

code:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

void run(const char *cmd, const char *arg){ 
    char *argv[3]; 
    asprintf(&argv[0],"%s", cmd); 
    asprintf(&argv[1], "%s", arg); 
    argv[2] = NULL; 
    pid_t pid = fork(); 
    if(pid == 0){ 
     execvp(argv[0], (char * const *) argv); 
     perror("error: "); 
     exit(EXIT_FAILURE); 
    } 
    waitpid(pid, NULL, 0); 
} 

void scriptexec(FILE *fp){ 
    char *line = NULL, *cmd = NULL, *arg=NULL, *delim=" \n\t"; 
    size_t len = 0; 
    while(getline(&line, &len, fp) != -1){ 
     cmd = strtok_r(line, delim, &arg); 
     if(cmd[0] != '#') 
      run(cmd, arg); 
    } 
} 

int main(int argc, char *argv[]){ 
    if(argc < 2) exit(EXIT_FAILURE); 
    FILE *fp; 
    if((fp = fopen(argv[1], "r")) == NULL) exit(EXIT_FAILURE); 
    scriptexec(fp); 
    fclose(fp); 
    return 0; 
} 

./a.out $ déposer

Je reçois cette sortie:

ls: invalid option -- ' 
' 
Try 'ls --help' for more information. 
ls: invalid option -- ' 
' 
Try 'ls --help' for more information. 
cat: /tmp/filex 
: No such file or directory 

J'ai également essayé d'écrire un autre code en utilisant la fonction run(), ça marche, pas de problème!

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

void run(const char *cmd, const char *arg){ 
    char *argv[3]; 
    asprintf(&argv[0],"%s", cmd); 
    asprintf(&argv[1], "%s", arg); 
    argv[2] = NULL; 
    pid_t pid = fork(); 
    if(pid == 0){ 
     execvp(argv[0], (char * const *) argv); 
     perror("error: "); 
     exit(EXIT_FAILURE); 
    } 
    waitpid(pid, NULL, 0); 
} 

int main(){ 
    run("ls", "-l"); 
} 

Je ne comprends pas ...

+0

Je doute code est en cours d'exécution de mémoire, encore 'argv [0]', 'argv [1]', 'doit être free'd coût média . – chux

+0

Avez-vous essayé de passer par le programme (non fonctionnel) dans un débogueur pour vérifier ce qui se passe, tout en surveillant toutes les variables et leurs valeurs? S'il vous plaît prendre le temps de [lire sur la façon de déboguer de petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+2

Faites attention à la position des citations. Vous avez des caractères LF où vous ne devriez pas. 'ls' dit que l'option' 'n'est pas une option valide. 'cat' dit qu'il ne peut pas trouver'/tmp/filex ' – ikegami

Répondre

2
ls: invalid option -- ' 
' 

Voir les deux guillemets simples. Une nouvelle ligne est passée à ls, qui est en effet une "option invalide".

getline() renvoie la nouvelle ligne, l'entrée a été déclenchée avec. Il suffit de le couper, si possible, avant de transmettre ce qui a été lu.

Pour ce faire, vous pouvez utiliser ceci:

line[strcspn(line, "\r\n")] = '\0';