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 ...
I-Code Zweifel aus dem Speicher ausgeführt wird, noch 'argv [0]', 'argv [1]', 'line' free'd werden soll . – chux
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/). –
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