Rediriger stdout vers un fichier
Je suis en train de faire l'équivalent de la commande bash ls>foo.txt
dans C.
Le code soufflet redirige la sortie d'une variable.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
int pfds[2];
char buf[30];
pipe(pfds);
if (!fork()) {
close(pfds[0]);
//close(1);//Close stdout
//dup(pfds[1]);
//execlp("ls", "ls", NULL);
write(pfds[1], "test", 5); //Writing in the pipe
exit(0);
} else {
close(pfds[1]);
read(pfds[0], buf, 5); //Read from pipe
wait(NULL);
}
return 0;
}
Les lignes de commentaires se réfèrent à celles de ces opérations qui, je crois, qui sont nécessaires pour la redirection.
Que dois-je changer de rediriger la sortie de la commande ls pour foo.txt?
Pourquoi êtes-vous de la création d'une pipe, quand il n'y a pas de tuyau indiqué dans la syntaxe shell vous imiter?
"Est équivalent à [cette bash code] dans C" n'est pas un bash question. Seulement le tag bash si vous voulez des gens qui sont des experts dans bash (et pas de C!) pour le regarder.
"Est équivalent à [cette bash code] dans C" n'est pas un bash question. Seulement le tag bash si vous voulez des gens qui sont des experts dans bash (et pas de C!) pour le regarder.
OriginalL'auteur qwerty | 2015-03-19
Vous devez vous connecter pour publier un commentaire.
Ce que votre code fait essentiellement est que vous ouvrez une pipe, puis à la fourche le processus et dans le processus de l'enfant (code commenté) à proximité stdout, dupliquer le canal de sortie standard (stdout) et de l'exécuter et de la commande ls, puis (en non-code commenté) écrire 4 octets pour le tuyau. Dans le processus parent, permet de lire des données à partir de la pipe et attendre la fin du processus enfant.
Maintenant, vous voulez rediriger stdout vers un fichier. Vous pouvez le faire que par l'ouverture d'un fichier à l'aide de l'open() de l'appel système et puis dupliquer ce descripteur de fichier sur la sortie standard stdout. Quelque chose comme (je n'ai pas testé cette méfiez-vous donc des bugs dans le code):
Cependant, vous pouvez également utiliser le freopen comme suggéré par l'autre réponse.
Cependant, j'ai plusieurs préoccupations de votre code et de mon code modifié:
La pipe() et open() appels système peut échouer. Vous devriez toujours vérifier l'appel de défaillance du système.
L'appel système fork() peut échouer. Idem.
dup2() peut être utilisé à la place de la dup(); sinon, le code suivant ne fonctionnera pas si stdin n'est pas ouvert car il reprend à la première descripteur de fichier.
La execlp() de l'appel système peut échouer. Idem.
Je pense wait() peut être interrompu par un signal (EINTR). Il est recommandé de s'enrouler autour d'un wrapper qui tentatives de l'appel système si il est interrompu par un signal (errno == EINTR).
OriginalL'auteur juhist
Tout en traitant avec redirection de la sortie vers un fichier, vous pouvez utiliser freopen().
En supposant que vous essayez de rediriger votre
stdout
à un fichier 'output.txt", alors vous pouvez écrire-Ici "
a+
" pour ajouter mode. Si le fichier existe, le fichier est ouvert en mode ajout. Sinon, un nouveau fichier est créé.Après la réouverture du
stdout
avecfreopen()
toutes les sorties de déclaration (printf, putchar) sont redirigés vers le "output.txt'. Alors, après que toutprintf()
déclaration de rediriger la sortie vers le 'output.txt' fichier.Si vous voulez reprendre
printf()
'comportement par défaut (qui est en cours d'impression dans le terminal/invite de commandes) alors vous devez réaffecterstdout
à nouveau en utilisant le code suivant-Ou -
Cependant même technique fonctionne pour '
stdin
'.OriginalL'auteur Razib