7
votes

Execv * et écrire dans stdin

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: xxx

code C: xxx

qui fonctionne: xxx

mais si j'essaie d'écrire directement sur le stdin à l'aide de tuyau, le programme affiche rien et continue à courir: < / p> xxx

merci pour votre aide

cordialement, Bastien.

Modifier le problème Résolu:

Merci pour vos réponses, le code qui fonctionne: xxx


0 commentaires

4 Réponses :


2
votes

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.

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).


0 commentaires

5
votes

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;
}


0 commentaires

3
votes

Execv 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.

Donc, ce que vous faites normalement est Fourche et, dans l'une des fourches, appelez Execv . Vous avez ensuite lu et écrivez à travers le tuyau de votre programme continuant dans l'autre fourche. Il existe généralement des fonctions popen pour le faire dans la plupart des langues; Malheureusement dans Posix, le popen () est strictement lu ou écrit et non bidirectionnel.

Heureusement, j'ai fabriqué, testé et publié A popen3 fonction . 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.


0 commentaires

0
votes

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.


0 commentaires