J'essaye d'exec() un appel à grep à l'intérieur de mon programme C. Je cherche le nombre d'occurrences d'un motif de chaîne dans un fichier donné, ce qui peut être réalisé avec:Comment utiliser execvp() avec grep?
$ grep -e my_string -F my_file.txt -c
Ce qui donne une sortie numérique comme prévu, par exemple:
5
Cependant, ce que j'espérais équivalent aurait des difficultés. Le code suivant:
char *arg_list[] = {"-e", "my_string", "-F", "my_file.txt", "-c", "\0"};
int pid;
if ((pid = fork()) == 0) {
if (execvp("grep", arg_list) < 0)
perror("execvp");
}
Résultats dans:
my_file.txt:5
-e: : No such file or directory
Il y a deux questions. Premièrement, je veux juste le numéro - pas le fichier dans lequel il est trouvé. Deuxièmement, je ne sais pas pourquoi il essaie d'affirmer que le drapeau -e doit être un fichier. Si je passe dans la liste des arguments pour être:
char *arg_list[] = {"-F", "my_file.txt", "-e", "my_string", "-c", "\0"};
Puis je reviens:
my_file.txt:5
-F: : No such file or directory
Je ne sais pas où commencer à chercher pourquoi cela se passe. Je ne sais pas non plus pourquoi la sortie de l'appel grep à partir de la ligne de commande est juste un nombre, mais l'appel exec() 'd grep sort à la fois le nom du fichier et le numéro.
Toute aide serait appréciée! Je vous remercie.
EDIT:
Solution: inclure le nom du programme dans la liste des arguments, ou simplement utiliser l'appel système(). Aussi, RTFM.
Avez-vous vraiment besoin d'utiliser execvp? Peut-être essayez simplement d'utiliser system(). –
Aussi, essayez de mettre "grep" comme premier arg dans votre args_list. –
Les deux fonctionnent parfaitement. C'est un exercice d'utilisation de exec(), c'est tout. Mais merci d'avoir signalé ce qui était juste sous mon nez! – Cody