Utilisation de fork() et des tubes/pipes[c++][linux:gcc]

Soyez le premier à donner votre avis sur cette source.

Vue 39 877 fois - Téléchargée 716 fois


Description

Ben ... Le but de ce code est tout simplement de se familiariser voir d'apprendre/comprendre comment fonctionne un fork() (processus fils et peres) ainsi que l'utilisation d'un tube de communication appelé Pipe ou Tube...
Ce programme aurait pu être écris sans Pipes ni fork()... c'est un prétexte...

Source / Exemple :


/**********************************************************/
/**********************************************************/
/*PROGRAMME SUR L'UTILISATION DE PIPES/TUBES ET DE FORK() */ 
/**********************************************************/
/*But : Ecrire dans un pipe/tube de communication une url */
/*(adresse internet) qui devra être lancée a l'aide de   */
/*lynx par un autre processus               */
/**********************************************************/                                           

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>

int fils1(), fils2();
int fd[2];

/**********************************/
/* fils 1 : Ecriture dans le tube */
/**********************************/
int fils1()
{
  char urli[100];
               
  close(fd[0]);
  printf("Saisir une url :\n");
  scanf("%s", urli);
  write(fd[1], &urli, 100);
  close(fd[1]);                  

  exit(0);           
}

/******************************************************/
/* fils 2 : Reception des données à la sortie du tube */
/*           et utilisation à travers lynx   */
/******************************************************/
int fils2()
{
  char urlo[100];
  close(fd[1]);                           
  read(fd[0], &urlo, 100);    
  printf("lynx --> %s\n", urlo);
  close(fd[0]);
  execl( "/usr/bin/lynx", "lynx", urlo, 0);   
  fprintf (stderr, "execl s'est mal passé...\n");   

  exit(0);
}

/***********************/
/* Fonction Principale */
/***********************/
int main()	
{ /* Processus Pere */
  int s, i;
  
  if (pipe(fd) != 0) /* fd devient descripteur de fichier */
    {
      fprintf(stderr,"Problemes dans l'ouverture de Pipe \n");
      exit(1);
    }
  
  /* Lancement d'un fils */
  if (	fork() == 0 )
    { /* Processus Fils 1 */
      fils1();     
    } 
  
  /* Lancement d'un fils */
  if ( fork() == 0 )
    { /* Processus Fils	2 */
      fils2();
    }		 
  
  
  close(fd[0]); 
  close(fd[1]);
  fprintf(stderr, "attente de la fin des processus!\n");
  i=wait(&s);   
  i=wait(&s);   
  printf("fin du programme\n");

  exit(EXIT_SUCCESS);
}

Conclusion :


NB: le code ecrit ci dessus est le même (sauf erreurs de ma part) que celui contenu dans le zip mis à part le fait que les commentaires sont beaucoup plus complets et plus propres dans le zip (ben il a fallu faire avec les contraintes du formulaire de sources alors désolé) :)...
Si jamais j'ai merdé kkpart dites le moi ... c'est mon premier post :)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

zanidip
Messages postés
76
Date d'inscription
lundi 30 septembre 2002
Statut
Membre
Dernière intervention
25 mars 2007
-
je vois pas poutquoi tu met les /*...*/a chaque ligne. a pars ca,j'ai rien compri... ca doi vouloir dire que le code est bon!
Cr0w
Messages postés
25
Date d'inscription
dimanche 6 octobre 2002
Statut
Membre
Dernière intervention
10 avril 2006
-
ben en fait, les /* */ a chaque ligne c pour faire plus propre et plus jolie :)
et ça encadre mes commentaire .. voila ... lol
Si tu veux des explications sur mon code ... no pb ... demande moi ce qui te derange ... :) Je t'expliquerai TOUT :)
Et oui le code est bon lol :Þ

Bye
Cr0w
Messages postés
25
Date d'inscription
dimanche 6 octobre 2002
Statut
Membre
Dernière intervention
10 avril 2006
-
Personne n'a rien a dire sur ce programme ?
Personne ne voudrait le noter ?
Bon ben ...ça c de l'encouragement pour un premier dépot !!!
Merci a tous !!!!
cmarsc
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003
-
salut,

on ne peut pas comprendre si ne ne connait pas un peu LINUX ou UNIX.
une petite explication de ce qu'est un processus et d'un tube aurait facilité les choses certainement ;-)

il faudrait mettre un void dans les prototypes sans arguments.
Cr0w
Messages postés
25
Date d'inscription
dimanche 6 octobre 2002
Statut
Membre
Dernière intervention
10 avril 2006
-
ça n'a rien a voir .... les void et les int ... c pas parcequ'il y a des arguments ou pas que ça va changer kelke chose !!!
Je crois que tu t'égards étranger ... si je mets int c parceque je renvois un int ... je ne comprends pas ce que tu veux dire !!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.