Forum Programmation.shell [Résolu] Redirections entre terminaux

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
25
mar.
2013

Bonjour, bonsoir

J'ai écris un programme console dans lequel est présent une sous-partie de recherche.
Cette sous-partie est constituée de deux programmes qui tournent en parallèle :
Un programme visuel dans lequel l'utilisateur peut renseigner le mot qu'il désire chercher :
"
Quel mot voulez-vous rechercher :
--> mot : _

--> expression 1
expression 2
expression …
"
Le but de cette sous partie est de faire un système de recherche dynamique, au sens ou la liste des expression s'actualise en temps réel. Mais afin de ne pas empêcher l'utilisateur de continuer à saisir pendant la recherche, cette dernière va être exécutée par un autre programme. Ce second programme va lire le mot à rechercher, le 'grepper' dans la big-liste des expressions, et renvoyer cette liste épurée au premier programme.
Pour cela, je passe par deux fichiers : un fichier "mot" dans lequel le premier programme va écrire en temps réel le mot à rechercher, fichier qui va être lu par le second programme; et un fichier "liste_epuree" dans lequel le second programme va écrire le résultat de sa recherche, fichier qui va être lu par le premier programme. Je récapitule sur un petit dessin!
Schéma 1

Maintenant que j'ai terminé mon programme, j'aimerais bien l'améliorer.
Je considère donc qu'il y a deux problèmes à mon programme :
- Je passe par des fichiers pour communiquer
- Mes deux sous programmes fonctionnent en boucle, et donc passent une bonne partie de leur temps à ne rien faire, sinon utiliser tout le processeur… :s
Je me suis donc renseigné pour savoir si je pouvais faire en sorte que mes deux terminaux puissent communiquer entre eux, et j'ai trouvé les '/dev/pts/x'
Je pense que je ne vous apprend rien si je vous dis que je peux faire apparaître un message sur le terminal pts/1 à partir du pts/0 grâce à 'echo truc 1>/dev/pts/1'
Très rapidement, j'ai eu un problème : lorsque j'utilise '0</dev/pts1'
J'ai essayé d'ouvrir deux console, une pts/0, une pts/1. Dans la 0, j'écris :
"
while true
do
read -s -N1 machin 0</dev/pts/1
echo $machin
done
"
Et dans la 1, je tape : 'sasesusiso'
Contre mon attente, dans la 0, j'obtient : 'aeuio'

--> Je suppose que je me trompe quelque part mais où ??

Sinon, en fait ce que j'aimerais pour mon programme, c'est qu'il réagisse de la manière suivante :
- Les deux sous-programmes attendent
- L'utilisateur appuie sur une touche
- Cette touche s'affiche sur l'écran et le programme 1 envoie un signal au programme deux dans lequel il renseigne le mot a chercher
- Le programme 2 lance une boucle de recherche
2 cas :
--> L'utilisateur appuie sur une touche avant que le 2eme programme ait terminé la recherche.
--> Le second programme a le temps de terminer sa recherche
1er cas : La boucle du second programme s'arrête et recommence avec le nouveau mot
2meme cas:
- Le programme 2 envoie un signal au programme 1 dans lequel il renseigne la liste à afficher
- Le programme 1 affiche la liste
Et ainsi de suite.

La ou je bloque c'est : comment faire communiquer les programmes ?

Merci d'avoir lu ce message, et je vous prie d'y répondre si vous connaissez un moyen de résoudre mon problème.

mistiru

  • # socket ?

    Posté par  . Évalué à 3.

    La ou je bloque c'est : comment faire communiquer les programmes ?

    tu as pensé à utiliser les sockets ou les pipes nommés ?

    • [^] # Re: socket ?

      Posté par  . Évalué à 1.

      Je ne connait ni l'un, ni l'autre. Je vais donc de ce pas me renseigner.
      Merci !

      • [^] # Re: socket ?

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

        Le mot-clef pour les recherches est “inter-process communication” abrégé en IPC.

        L'attirail de base contient les signaux (trap), les tubes nommés (mkfifo) aussi appelés sockets dans le système de fichiers et les socket réseau (netcat).

        Je te conseille de lire rapidement un chapitre d'un bouquin de programmation système — comme La programmation sous UNIX de Rifflet, tellement vieux que tu dois en trouver à 4€ d'occasion — qui explique un peut comment tout marche et te montre les exemples classiques.

    • [^] # Re: socket ?

      Posté par  . Évalué à 1.

      Euh… Si en fait les tubes nommés je connaissait, et j'y avait pensé (en fait je ne savais pas comment cela s'appelait) mais dans l'exemple que j'ai lu, lorsque j'ai appris que ça existait, c'éatit écrit :
      bash
      mkfifo foo
      (1) script -f foo
      (2) cat foo

      et je ne savais pas les utiliser d'une autre manière. Merci de m'avoir indiqué comment ça s'appelait !

      • [^] # Re: socket ?

        Posté par  . Évalué à 1.

        En fait, c'est exactement ce que je cherchais, les fifo. Merci bcp

        Par contre pour le 0</dev/pts/1 avec les 2 lettres pour une, je ne comprends toujours pas.

        • [^] # Re: socket ?

          Posté par  . Évalué à 0.

          Salut,

          mistiru:

          Par contre pour le 0</dev/pts/1 avec les 2 lettres pour une, je ne comprends toujours pas.

          C'est probablement dû au fait que tu as deux programmes qui tentent de lire le même fichier : le shell lié à /dev/pts/0 (via la commande read) et le shell lié à /dev/pts/1. De ce fait, ils obtiennent chacun une portion des données (en l'occurrence chacun une lettre, mais cela pourrait être autre chose).

          • [^] # Re: socket ?

            Posté par  . Évalué à 0.

            Merci beaucoup, je pense comme toi.

Suivre le flux des commentaires

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