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

Soyez le premier à donner votre avis sur cette source.

Vue 44 089 fois - Téléchargée 766 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
Lyrus
Messages postés
1
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
7 janvier 2010

7 janv. 2010 à 00:33
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.
woot6768
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

1 déc. 2006 à 14:18
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
Cr0w
Messages postés
25
Date d'inscription
dimanche 6 octobre 2002
Statut
Membre
Dernière intervention
10 avril 2006

24 avril 2003 à 07:42
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++)
tobratus
Messages postés
5
Date d'inscription
jeudi 9 mai 2002
Statut
Membre
Dernière intervention
20 septembre 2005

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

12 déc. 2002 à 16:09
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.