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

Soyez le premier à donner votre avis sur cette source.

Vue 40 444 fois - Téléchargée 723 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

Messages postés
1
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
7 janvier 2010

Je trouve le code clair et commenté à souhait^^

Par contre peu être qu'un petit laïus au début aiderait a la compréhension.
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Salut,
Le code est sympa mais il faudrait peut être que tu utilise des variables explicites pour que le code soit plus lisible et surtout plus simple à comprendre...
Voilà sinon c'est sympa.
Woot
Messages postés
25
Date d'inscription
dimanche 6 octobre 2002
Statut
Membre
Dernière intervention
10 avril 2006

Bon eh bien je ne suis pas trop au courant des fork et des file descriptor en C++ côté Windows mais je suppose que tout cela existe mais que la bibiliothèque est différente ... @ mon avis tu trouveras des informations plus précises sur tout ceci dans la msdn (cf www.windows.fr --> rubrique developpeurs (MSDN) ou dans ton aide attachée à visual C++)
Messages postés
5
Date d'inscription
jeudi 9 mai 2002
Statut
Membre
Dernière intervention
20 septembre 2005

Comment écrire quelque chose de similaire pour des applications windows, compilation Visual C/C++
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003

je parlais de int main(void)
Afficher les 10 commentaires

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.