2012-05-03 1 views
1

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.

+2

Avez-vous vraiment besoin d'utiliser execvp? Peut-être essayez simplement d'utiliser system(). –

+4

Aussi, essayez de mettre "grep" comme premier arg dans votre args_list. –

+0

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

Répondre

3

Vous avez deux problèmes (insertion de citation JWZ sur les expressions régulières ici):

  1. Le premier argument dans le tableau passé exec est transmis en tant que argv[0] au nouvel exécutable. Ordinairement, c'est le nom de l'exécutable, et c'est ce que les programmes utilisent pour déterminer leur propre nom. Donc vous dites à grep que son nom est -e, et ses arguments sont my_string -F my_file.txt -c "". Il n'obtient pas l'argument -e comme vous pourriez vous y attendre, donc il interprète mal ses arguments et vous donne une erreur.

  2. Vous ne terminez pas correctement le tableau d'arguments NULL à exec. Le dernier argument doit être un littéral NULL, pas une chaîne "\0". Cette chaîne est une chaîne vide, mais ce n'est pas un pointeur nul.