Forum Programmation.c problème TTY et redirection Entrées/Sorties

Posté par  .
Étiquettes : aucune
0
15
déc.
2004
Bonjour,

Dans un programme en C, je souhaite rediriger les E/S d'un programme(par exemple ftp) vers deux tubes(nommé ou non), un pour l'entrée et un pour la sortie.

Quand je redirige uniquement STDOUT, les sorties dans le tube se font correctement.
Mais si je redirige aussi STDIN, ce n'est plus le cas, les sorties n'apparaissent alors qu'à la terminaison du programme, et sans les prompts.

Apparament ça viens du fait que STDIN n'est pas un TTY, je souhaiterait savoir si il ya un moyen de faire croire au programme que STDIN est un TTY, ou alors de régler ce problème autrement(même en shell si nécéssaire).


Merci.
A+
  • # Mouais

    Posté par  (site web personnel) . Évalué à 1.

    Par hasard tu n'utiliserais pas aucun retour de ligne (\n)?
    Parce que linux n'envoit les données qu'a la reception d'un \n, donc si t'as tout sur une seule ligne ben voila.....
    • [^] # Re: Mouais

      Posté par  (site web personnel) . Évalué à 0.

      je pense aussi que ton bug est independant de la nature de ton entree. Le fait que ce n est pas un tty ne doit pas t empecher de rediriger.

      Tu peut essayer le mode raw, ou le mode nonbufferise

      Dans un de mes codes, je fais ca sur le terminal :
      tcgetattr (STDIN_FILENO, &term);
      term.c_lflag &= ~(ICANON | ECHO);
      tcsetattr (STDIN_FILENO, TCSANOW, &term);

      ce qui me permet de passer en mode instantane.

      le pb peut aussi venire de la maniere dont tu redirige ton entree ... c est un herescript ?

      donne donc des exemples qui marchent ET qui marchent pas ...

      Enfin, n oublie jamais que UNIX gere lui meme les buffers I/O ... parfois les comit arrivent au moment ou tu ne t y attends pas ... parfois sur un newline, parfois sur un EOF, parfois a chaque scheduling ...
  • # man ptmx

    Posté par  . Évalué à 1.

    J'ai jamais essayé, mais apparement il y a moyen en C de créer des pseudo-terminaux (en ouvrant /dev/ptmx, et en appelant grantpt() et compagnie...).
  • # stdin, stdout, stderr

    Posté par  . Évalué à 1.

    regarde "man setlinebuf"
  • # pseudo terminaux

    Posté par  . Évalué à 1.

    pour la plupart des programmes la methodes avec les tubes simple devrait marcher mais si tu veux capturer les orties de programmes comme "su" "passwd" et autres qui vérifient si ils sont sur un terminal tu devra utilise un pseudo-terminal c'est un periph virtuel géré par le noyau

    reagarde du cote des fonctions :

    int getpt(void);
    int getrantpt(int descripteur);
    int unlockpt(int descripteur);
    char * ptsname(int descripteur);

    infos trouvé dans "Programmtion sytème en C sous Linux" p862 chapitre 33 gestion du terminale C Blaess

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.