suite de tubes ou pipes

suite de tubes ou pipes - Shell/Batch - Programmation

Marsh Posté le 04-11-2003 à 15:31:06    

je dois realiser un mini shell qui gere plusieurs pipes
 
mais je sais pas comment ca marche :D
y a-t-il une mecanisme de synchro ou tous les pipes "agissent-ils" en meme temps?

Reply

Marsh Posté le 04-11-2003 à 15:31:06   

Reply

Marsh Posté le 04-11-2003 à 16:34:49    

bah nan tu as un phénomène de priorité comme avec n'importe quel opérateur... quand tu fais 2*4*6*8 tu ne fait pas le calcul simultanément... avec les pipes c'est pareil

Reply

Marsh Posté le 05-11-2003 à 11:23:02    

le pipe  |  se sert la commande en amont comme son entrée standart.
autrement dit dans : ls | grep toto | more
le shell va executrer le ls auquel il va faire un grep toto et sur le resultat du grep va faire son more.
 

Reply

Marsh Posté le 06-11-2003 à 11:08:19    

je dois programmer ca en c...
 
le pipe fait des lancements concurrents
je peux pas attendre que l execution d une commande soit finie pour en executer une autre, c bien ca?

Reply

Marsh Posté le 06-11-2003 à 11:15:54    

synchro synchronization :D
 
"le pipe fait des lancements concurrents" :??: tu entends quoi par là?
Tu fais un fork() à chaque fois et tu ouvres un pipe entre ton processus père et le fils. Il y a des moyens de se synchroniser justement que tu fais de la programmation concurrente.
Je me rappelle quand j'étais petit on avait codé un shell (TP); on s'était marrés à faire des tableaux de pipes etc.

Reply

Marsh Posté le 06-11-2003 à 19:55:28    

tu l aurais pas sur toi? :D

Reply

Marsh Posté le 06-11-2003 à 21:56:18    

Un petit exemple d'utilisation des pipes en C sous linux si ça peux t'aider à comprendre le principe  
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #ifndef HAVE_NOT_UNISTD_H
  5. # include <unistd.h>
  6. #endif
  7. #ifdef HAVE_NOT_PID_T
  8. typedef int     pid_t;
  9. #endif
  10. int     main(int argc, char **argv)
  11. {
  12.   int   p[2];
  13.   pid_t pid;
  14.   if (pipe(p) < 0)
  15.     fprintf(stderr, "pipe" );
  16.   if ((pid = fork()) < 0)
  17.     fprintf(stderr, "fork" );
  18.   if (!pid)
  19.     {
  20.       close(p[0]);
  21.       dup2(p[1], 1);
  22.       execlp("ls", "ls", "-l", "/dev", 0);
  23.       fprintf(stderr, "execl" );
  24.     }
  25.   else
  26.     {
  27.       close(p[1]);
  28.       dup2(p[0], 0);
  29.       execlp("more", "more", 0);
  30.       fprintf(stderr, "execl" );
  31.     }
  32.   return 0;
  33. }


 
A+

Reply

Marsh Posté le 07-11-2003 à 15:37:17    

avec un ca va :/
c est avec plus que ca pose probleme :(

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed