begin process at 2012 02 09 13:44:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > UTILISATION DE FORK() ET DES TUBES/PIPES[C++][LINUX:GCC]

UTILISATION DE FORK() ET DES TUBES/PIPES[C++][LINUX:GCC]


 Information sur la source

Note :
8,25 / 10 - par 4 personnes
8,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Niveau :Initié Date de création :21/11/2002 Date de mise à jour :03/12/2002 12:02:00 Vu / téléchargé :33 358 / 623

Auteur : Cr0w

Ecrire un message privé
Site perso
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 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

  • /**********************************************************/
  • /**********************************************************/
  • /*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);
  • }
/**********************************************************/
/**********************************************************/
/*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 :)    

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE par pgl10
Source avec Zip Source avec une capture POUR AFFICHER LES CARACTÈRES ACCENTUÉS SOUS WINDOWS EN MODE ... par pgl10
Source avec Zip PETITE CLASSE DE GESTION DES PROCESSUS SOUS WINDOWS par wisar
Source avec Zip KEYLOGGER AVEC NOM DU PROCESSUS ET DE LA FENETRE QUI A LE FO... par wisar
Source avec Zip LINUX USB BOOT LEGER par patatalo

Commentaires et avis

Commentaire de zanidip le 21/11/2002 15:39:08

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!

Commentaire de Cr0w le 22/11/2002 01:17:58

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

Commentaire de Cr0w le 03/12/2002 12:00:51

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 !!!!

Commentaire de cmarsc le 04/12/2002 08:38:52

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.

Commentaire de Cr0w le 04/12/2002 23:08:22

ç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 !!

Commentaire de cmarsc le 12/12/2002 16:09:00

je parlais de int main(void)

Commentaire de tobratus le 24/04/2003 04:41:46

Comment écrire quelque chose de similaire pour des applications windows, compilation Visual C/C++

Commentaire de Cr0w le 24/04/2003 07:42:23

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 --&gt; rubrique developpeurs (MSDN) ou dans ton aide attachée à visual C++)

Commentaire de woot6768 le 01/12/2006 14:18:13

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

Commentaire de Lyrus le 07/01/2010 00:33:31 7/10

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.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,359 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales