begin process at 2012 05 28 22:04:58
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Réseau & Internet

 > 

Communiquer entre processus avec des pipe


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Communiquer entre processus avec des pipe

jeudi 8 octobre 2009 à 16:53:02 | Communiquer entre processus avec des pipe

akrogames

Bonjour,


Je souhaite réaliser un programme pour m'entrainer à créer des anneaux avant de passer à la programmation socket. Mon objectif : faire passer un entier qui s'incrémente sur chaque fils grâce à un jeton. Je dois créer une topologie virtuelle avec des fork() et faire circuler un jeton qui contient un entier qui s'incrémente en passant dans chaque processus.

J'ai besoin de votre aide au niveau algorithmique. En effet j'y ai réfléchi ce soir et je ne voit pas comment faire pour mettre en attente un processus qui doit en attendre un autre. C'est mon premier problème. Mon second est le suivant : qu'elle sera l'identifiant unique de chaque processus ? Comment les récupérer en C ?

Alors voilà ce que je souhaite faire :

Pere > Fils1 > Fils2 > Fils3> Fils4 > Fils5 > Fils1 > Fils2 etc...

Jusqu'à ce que le jeton qui transite sur l'anneau qui contient l'entier atteigne 50. Il s'incrèmente sur chaque Fils de +1. Vous comprenez ?


J'ai réalisé ce code où les processus ont tous le même père mais je suis obligé de faire un exit chaque fois ?
Alors comment faire pour els faire communiquer entre eux ?

Mon code :
Code C/C++ :
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

#define lire 0
#define ecrire 1

int main(int argc,char **argv)
{
	//gestion des clients
	int pid[5]; //liste des clients fils
	int f[5];
	int i;
	int pid0;
	int ppid;
	
	//gestion des tubes
	int f1f2[2];
	int f2f3[2];
	int f3f4[2];
	int f4f5[2];
	int f5f1[2];
	
	//creation des differents tubes
	if(pipe(f1f2) == -1)
	{
		printf("erreur : initialisation impossible du tube entre fils 1 et fils 2\n");
		return 1;
	}
	if(pipe(f2f3) == -1)
	{
		printf("erreur : initialisation impossible du tube entre fils 2 et fils 3\n");
		return 1;
	}
	if(pipe(f3f4) == -1)
	{
		printf("erreur : initialisation impossible du tube entre fils 3 et fils 4\n");
		return 1;
	}
	if(pipe(f4f5) == -1)
	{
		printf("erreur : initialisation impossible du tube entre fils 4 et fils 5\n");
		return 1;
	}
	if(pipe(f5f1) == -1)
	{
		printf("erreur : initialisation impossible du tube entre fils 5 et fils 1\n");
		return 1;
	}
	
	for(i=1;i<6;i++)
	{
		f[i] = fork();
		if(f[i] < 0 )
		{
			printf("erreur : creation impossible du fils 1\n");
			return 1;
		}
		else if(f[i] == 0)
		{
			pid[i] = getpid();
			ppid = getppid();
			printf("fils %d creer avec le numero : %d pere=>%d\n",i,pid[i],ppid);
			exit(i);
		}		
	}
	
	
	
	exit(0);
	
	
	
}


Bonne journée
jeudi 8 octobre 2009 à 22:01:59 | Re : Communiquer entre processus avec des pipe

uaip

Salut,

Tu oublies une condition après la création du fork():
fork() < 0 -> erreur
fork() = 0 -> processus fils (id_pere = getppid() et id_fils = getpid())
fork() > 0 -> processus père (id_pere = getpid() et id_fils = retour de fork())
Pour la duplication du code, blabla, je pense que tu as compris.

A ta place, j'enlèverai la boucle et ferai du cas pas cas, car dans chaque processus, tu dois fermer une extrémité des tubes (avec close(descripteur);).
Pour les faire communiquer entre eux, suffit d'utiliser les fonctions read() et write().

En gros, de mémoire (car je ne prog pas énormément sous linux), voici ce que donnerait un échange entre 2 processus père et fils (le père envoie un entier au fils):
Code C/C++ :
int main() {
	int descripteur[2]; //descripteur du tube anonyme
	//création du tube anonyme
	if (pipe(descripteur) == -1) { puts("erreur de création du tube"); exit(1); }
	//duplication du processus
	pid_t pid=fork();
	if (pid < 0) { puts("erreur de duplication du processus") exit(1); }
	//cas du processus fils
	if (pid == 0) {
		close(descripteur[1]); //fermeture de l'entrée du tube
		//lecture du tube
		size_t res;
		int nbr;
		res=read(descripteur[0],(int*)&nbr,sizeof(int));
		//vérification des erreurs
		//cas d'une erreur système
		if (res < 0) { puts("erreur de lecture du tube"); exit(1); }
		//cas où le processus écrivain a fermé son extrémité du tube
		else if (res != sizeof(int)) { puts"erreur de lecture du tube"); exit(1); }
		//sinon, tout s'est bien passé, affichage de l'entier lu
		printf("entier lu: %d\n",nbr);
		close(descripteur[0]; //fermeture du descripteur
	}
	//cas du processus père
	else if (pid > 0) {
		close(descripteur[0]); //fermeture de la sortie du tube
		//ecriture dans le tube
		size_t res;
		int nbr=5; //entier écrit
		res=write(descripteur[1],(int*)&nbr,sizeof(int));
		//vérification des erreurs
		if (res != sizeof(int)) { puts("erreur d'écriture dans le tube"); exit(1); }
		close(descripteur[1]; //fermeture du descripteur
	}
}


Voilà comment on communique dans le cas d'un tube anonyme (de mémoire, il y a sans doute des erreurs).

Ensuite, pour attendre, plusieurs possibilités : wait(), waitpid(), pause(), (d'autres, à oublier dans ton cas: sleep(), alarm(), ...)
Les problèmes :
- wait() attend la fin de n'importe quel processus
- waitpid() attend la fin d'un processus fils (donc à utiliser uniquement pour le processus père)
- pause() attend n'importe quel signal (ce qui permet à l'autre processus de le réveiller en lui envoyant un signal, mais si c'est le système qui, pour une raison quelconque, lui en envoie un, c'est fichu)

Et là... désolé mais j'ai plus le courage de réfléchir ce soir

Mais dis moi, ce ne serait pas un TP ton truc (tu dis "je dois faire ça") ? Si c'est un projet personnel, pourquoi ne pas utiliser les segments de mémoire partagée (+ éventuellement les sémaphores) ? Ce serait, à mon avis, plus simple que les tubes.


En fait, tu as un exempleconcret de tube anonyme ici

Bonne chance !

Cordialement, uaip.


Cette discussion est classée dans : int, fils, processus, pipe, if


Répondre à ce message

Sujets en rapport avec ce message

récuperation de l'etat d'un processus [ par Spy63 ] J'ai un programme en C systeme que j'ecrit sous vi pour linux dans lequel:-j'ai un pere et deux fils.-Mon but et d'atendre que les fils soit en pause UNIX: Probleme de pipe (2): le source ne passe pas entierement [ par CoreBreaker ] int fds[2];... int f= open("arch.cpio", O_RDONLY); pid_t p; pipe(fds); p= fork(); if( p > 0 ) { char buf[1024]; int n; while( (n= read( UNIX: Problème de pipe [ par CoreBreaker ] La communication à travers un pipe ne se fait pas.Kelkun pourrait-il m'aider ?int fds[2];int f= open("fichier", O_RDONLY);pid_t p;pipe(fds); Variable global et processus [ par obasileus ] Salut j'ai un programme comportant 4 processus fils qui lancent chacun 4 threads qui gèrent 2 problemes producteur/consom. Le processus pere à besoin communication inter processus sous linux [ par boumarsel ] voila un processus cree un processus fils par fork, le fils execute un traitement (fonction) et retourne une valeur que je veux recuperer par le proce (C) Comment créer des processus fils? [ par berserker21 ] Sans utiliser la fonctions fork() vu que je programme sous windows. Le but étant de permettre a plusieurs clients de se connecter à mon apli serveur e j'ai un probleme en c++ avec les liste chainé [ par walidos09 ] /*l'ennoncé de mon projet :on désire concevoir par l'approche objet, une application pour simulerle fonctionnement du noyau du systéme le fonctionneme Problème avec GetMessage d'un processus parent [ par RV2931 ] Bonjour, j'ai un problème de communication, mais je suis informaticien, donc tout s'explique :), nan plus sérieusementDans le processus père, j'utilis Pipe et write(...) [ par diablo31170 ] Salut à tous, Comme son nom l'indique, je suis en train de faire de la communication entre 2 processus père et fils. Avant d'évoquer mon problème variable partagé entre processus [ par facilus ] Bonjour,j'ai fais un programme en c sous unix qui consiste a creer 3 fils (avec fork) , j'ai declaré 2 variables globales leur valeurs doivent etre le


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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,640 sec (3)

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