Programme d’exécution UNIX dans un autre programme

J’essaie d’exécuter un programme depuis un programme C (sous UNIX).

On m’a donné un exécutable (le programme nécessite une entrée de chaîne pendant l’exécution et écrit cette entrée dans un autre fichier appelé sample) appelé exec et je veux l’exécuter dans program.c, mais en donnant la chaîne par indirection.

Pour cela j’ai créé un fichier comme suit:

% vim input 

J’ai écrit ce qui suit à l’intérieur du fichier d’entrée

 content 

Maintenant, dans program.c,

 #include int main() { const char* command = "./exec < input"; execvp(command, NULL); return 0; } 

Lorsque je lance le programme, le contenu n’est pas entré dans le fichier exemple.

Mais quand je le lance sans indirection, c’est à dire

 const char* command = "./exec"; 

Ensuite, cela fonctionne et l’entrée est entrée dans le fichier d’échantillon.

Quelqu’un peut-il s’il vous plaît dire ce que je fais mal dans la syntaxe d’indirection.

Merci.

La syntaxe que vous utilisez est supposée être interprétée par un shell comme bash, csh, ksh, etc.

L’appel système execvp n’attend que le chemin de l’exécutable et un certain nombre d’arguments, le shell n’y est pas appelé.

Pour effectuer la redirection de cette manière, vous devrez utiliser l’appel système dup2(2) avant d’appeler execvp :

 int fd = open("input", O_RDONLY); /* redirect standard input to the opened file */ dup2(fd, 0); execvp("/path/to/exec", ...); 

Bien sûr, vous aurez besoin de vérifier les erreurs supplémentaires dans un programme réel.

Vous ne pouvez pas faire de redirection comme celui-ci avec execvp . Utilisez system() ou commencez à être amical avec dup() et vos amis. Vous pouvez google “implémenter la redirection”. Vous allez probablement trouver beaucoup d’exemples de la façon dont les shells (par exemple) traitent ce problème.

La famille de fonctions exec(3) ne sait rien des lignes de commande de redirection d’entrée ou d’parsing: elle essaie d’exécuter exactement l’exécutable que vous lui donnez. Il essaie de rechercher un fichier exécutable nommé "./exec < input" , ce qui n’existe pas, sans surprise.

Une solution serait d'utiliser la fonction system(3) au lieu de exec . system appelle le shell de l'utilisateur (tel que /bin/bash ), qui est capable d'parsingr la ligne de commande et d'effectuer les redirections appropriées. Mais, system() n'est pas aussi polyvalent exec , il peut donc convenir ou non à vos besoins.

La meilleure solution est de faire vous-même la redirection d’entrée. Ce que vous devez nous faire, utilisez open(3) pour ouvrir le fichier et dup2(3) pour dupliquer le descripteur de fichier sur le descripteur de fichier 0 (entrée standard), puis exec l'exécutable.