J'essaie d'exécuter un programme avec une entrée standard spécifique. Je réussis à utiliser un descripteur de fichier d'un fichier où il y a ce que je veux mettre dans le stdin, mais je ne parviens pas à écrire directement sur le stdin: code C: p> qui fonctionne: p> mais si j'essaie d'écrire directement sur le stdin à l'aide de tuyau, le programme affiche rien et continue à courir: < / p> merci pour votre aide p> cordialement,
Bastien. P> Modifier le problème Résolu: p> Merci pour vos réponses, le code qui fonctionne: p>
4 Réponses :
Lorsque vous appelez le tuyau, FD [0] est ouvert pour la lecture et FD [1] est ouvert pour l'écriture. Vous devriez être dup'ing STDIN sur le côté de lecture (FD [0]) et écrire au côté écriture (FD [1]). Vérifiez la valeur de retour de l'écriture: il est probablement -1. P>
Mais il y a un problème plus important. Vous ne fermez jamais de chaque côté du tuyau. Bash peut bloquer sur une lecture et ne jamais faire quoi que ce soit que le côté écriture du tuyau soit fermé. Vous devriez fermer les deux côtés du tuyau après avoir dup et écrit. (Ou définir fd_cloexec). P>
Vous devez duper le côté de lecture du tuyau sur stdin code>, pas le côté écriture. (Et écrivez sur le côté écriture, évidemment.)
#include <unistd.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int fds[2];
char cmd[] = "echo hello\nexit\n";
pipe(fds);
close(STDIN_FILENO);
dup2(fds[0], STDIN_FILENO);
write(fds[1], cmd, strlen(cmd));
char *const args[] = { "bash", NULL };
execvp("bash", args);
return 0;
}
Donc, ce que vous faites normalement est Heureusement, j'ai fabriqué, testé et publié A Execv code> et amis remplacent le programme d'exécution actuel avec le spécifié; Ils ne rentrent pas - l'exécution continue au début du nouveau programme. P>
Fourche code> et, dans l'une des fourches, appelez
Execv code>. Vous avez ensuite lu et écrivez à travers le tuyau de votre programme continuant dans l'autre fourche. Il existe généralement des fonctions code> popen code> pour le faire dans la plupart des langues; Malheureusement dans Posix, le popen () est strictement lu ou écrit et non bidirectionnel. P>
popen3 code> fonction forte>. Cela vous permet de récupérer trois descripteurs de fichiers - un pour STDIN au processus et deux pour stdout et stardr. Vous pouvez ensuite utiliser l'écriture () sur le stdin. P>
Notez également que vous le faites comme vous le faites, vous dépendez de la taille du tampon de tuyau. Si vous écrivez trop, écrivez sera bloqué car il n'y a pas de lecteur. Faites-le de manière fiable, vous devriez faire la fourchette (), faire exécuter dans l'enfant et écrire sur le tuyau dans le parent. De cette façon, le tuyau aura un lecteur et vous pourrez écrire autant de données que vous le souhaitez. P>