2017-05-16 2 views
2

Ich schrieb diesen Code, der eine Datei öffnet und führt jede Zeile von Dateien exept Kommentar "#":Probleme mit execvp() und/oder Strings, warum dieser Code nicht funktioniert?

Meinedat:

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 $ Datei

ich diese Ausgabe erhalten:

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 

Ich habe auch versucht, einen anderen Code mit der Funktion run() zu schreiben, es funktioniert, keine Probleme!

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

ich nicht verstehen kann ...

+0

I-Code Zweifel aus dem Speicher ausgeführt wird, noch 'argv [0]', 'argv [1]', 'line' free'd werden soll . – chux

+0

Haben Sie versucht, in einem Debugger durch das (nicht funktionierende) Programm zu gehen, um zu überprüfen, was passiert, während Sie alle Variablen und ihre Werte überwachen? Bitte nehmen Sie sich etwas Zeit [lesen Sie, wie Sie kleine Programme debuggen können] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+2

Achten Sie auf die Position der Anführungszeichen. Sie haben LF-Zeichen, wo Sie nicht sollten. 'ls' sagt, dass die Option' 'keine gültige Option ist. 'Katze' sagt, dass es '/ tmp/filex ' – ikegami

Antwort

2
ls: invalid option -- ' 
' 

Siehe die beiden einfachen Anführungszeichen. Es wird eine neue Zeile an ls übergeben, was in der Tat eine "ungültige Option" ist.

getline() gibt die neue Zeile zurück, mit der der Eingang ausgelöst wurde.

Hacken Sie es einfach ab, wenn Sie herum, bevor Sie weitergeben, was gelesen worden war.

Dazu können Sie verwenden:

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