J'écris un programme C où je fork()
, exec()
et wait()
. Je voudrais prendre la sortie du programme que j'ai exécuté pour l'écrire dans un fichier ou un tampon.
Par exemple, si j'exécute ls
je veux écrire file1 file2 etc
dans le tampon/fichier. Je ne pense pas qu'il existe un moyen de lire stdout, donc cela signifie-t-il que je dois utiliser un tuyau? Y a-t-il ici une procédure générale que je n'ai pas pu trouver?
Pour envoyer la sortie vers un autre fichier (je laisse de côté la vérification des erreurs pour me concentrer sur les détails importants):
if (fork() == 0)
{
// child
int fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
dup2(fd, 1); // make stdout go to file
dup2(fd, 2); // make stderr go to file - you may choose to not do this
// or perhaps send stderr to another file
close(fd); // fd no longer needed - the dup'ed handles are sufficient
exec(...);
}
Pour envoyer la sortie vers un tube afin que vous puissiez ensuite lire la sortie dans un tampon:
int pipefd[2];
pipe(pipefd);
if (fork() == 0)
{
close(pipefd[0]); // close reading end in the child
dup2(pipefd[1], 1); // send stdout to the pipe
dup2(pipefd[1], 2); // send stderr to the pipe
close(pipefd[1]); // this descriptor is no longer needed
exec(...);
}
else
{
// parent
char buffer[1024];
close(pipefd[1]); // close the write end of the pipe in the parent
while (read(pipefd[0], buffer, sizeof(buffer)) != 0)
{
}
}
Vous devez décider exactement ce que vous voulez faire - et de préférence l'expliquer un peu plus clairement.
Si vous savez dans quel fichier vous voulez que la sortie de la commande exécutée aille, alors:
Si vous souhaitez que le parent lise la sortie de l'enfant, faites en sorte que l'enfant redirige sa sortie vers le parent.
Puisque vous semblez que vous allez utiliser ceci dans un environnement linux/cygwin, vous voulez utiliser popen . C'est comme ouvrir un fichier, seulement vous obtiendrez les programmes d'exécution stdout
, vous pouvez donc utiliser votre fscanf
, fread
etc. normal.
Après la fourche, utilisez dup2(2)
pour dupliquer le FD du fichier dans le FD de stdout, puis exécutez.