Le faible -la façon d'exécuter un programme avec une entrée provenant d'un fichier est de:
- ouvrir le fichier pour la lecture à l'aide
open
- utiliser l'appel à dupliquer le fichier ouvert du système
dup2
au-dessus de la poignée pour l'entrée standard (toujours gérer 0
)
close
la vieille poignée (la copie dupliqué sur le dessus de la poignée 0
restera ouvert)
- utilisez
execve
ou une autre fonction de la famille exec
pour passer au nouveau programme, qui aura maintenant son entrée standard ouverte au fichier.
Ceci est la même manière que le shell lui-même implémente la redirection d'entrée < file
.
Voici un exemple qui fonctionne /usr/bin/rev
en utilisant l'entrée d'un fichier commands.txt
dans le répertoire courant:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern char **environ;
#define ERROR(msg) do { perror(msg); exit(1); } while(0)
int main()
{
// open the input file
int fd = open("commands.txt", O_RDONLY);
if (fd == -1)
ERROR("open");
// "dup" the handle to standard input (handle 0)
if (dup2(fd, 0) == -1)
ERROR("dup2");
// close the old handle
close(fd);
// exec the program
char *args[] = {"rev", NULL};
execve("/usr/bin/rev", args, environ);
// the program never gets here, unless the exec fails
ERROR("execve");
return -1;
}
Vous pouvez également utiliser la commande system
qui exécute une commande shell, y compris la redirection, de sorte que le programme:
#include <stdio.h>
#include <stdlib.h>
#define ERROR(msg) do { perror(msg); exit(1); } while(0)
int main()
{
if (system("/usr/bin/rev <commands.txt"))
ERROR("system");
// this *will* return after completion
return 0;
}
fonctionnera aussi bien. Ici, l'appel system
appelle réellement une copie d'un shell ("/ bin/sh") pour traiter la ligne de commande comme s'il s'agissait d'une commande shell.
Cela est plus pratique, mais vous avez moins de contrôle sur le processus d'appel du programme enfant (par exemple, configuration de son environnement, nettoyage de sa liste d'arguments, etc.). Il existe également des problèmes de sécurité potentiels complexes avec l'utilisation de system
qui peut poser problème si votre programme s'exécute sous la forme root
, bien que cela ne soit pas un problème ici.
sur linux vous pouvez utiliser popen() – technosaurus