Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/12/2005, à 13:57

Pak

Processus père/fils en C

Bonjour,
J'aimerais avoir un lien qui explique le fonctionnement des messages entre les processus père et fils merci

#2 Le 09/12/2005, à 14:05

max63

Re : Processus père/fils en C

Il y a plusieur méthode pour communiquer entre 2 processus, pipe, mémoir partagé etc... tu veux utlisé quoi en fait


Tout sur l'actualité frakassante du libre : http://www.frakass.org

Hors ligne

#3 Le 09/12/2005, à 14:20

Pak

Re : Processus père/fils en C

Je veux juste les "pipe", avoir un manuel qui explique clairement leur fonctionnment

#4 Le 09/12/2005, à 18:11

thom

Re : Processus père/fils en C

Voici un exemple commenté qui te permetra de comprendre si tu as déjà fait un peu de C.

/***************************************************************************
 *            intro3.c
 *
 *  Wed Nov 16 19:04:30 2005
 *  Copyright  2005  Thomas Vanstals
 *  thomasvst@gmail.com
 ****************************************************************************/

/*
Exercice 3 : Processus et pipes
-------------------------------
Ecrire un programme qui crée (via un fork) un processus fils, lui envoie deux 
entiers, et attend ensuite que ce dernier lui renvoie le résultat de l'addition 
de ces deux entiers. Faites-en deux versions : une avec un pipe, l'autre avec 
un fifo.  

Hint : man de 
fork(29), pipe(738) , close, read(502), write, mkfifo(749).
*/

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

int add_pipe (void);
int add_fifo (void);

int
main (void)
{
	if ((add_pipe ()) == 0)
		return EXIT_SUCCESS;
	else
		return EXIT_FAILURE;
}

int
add_pipe (void)
{
	// rem : le tube est limité aux descendants du processus de démarrage
	int tube[2];
	int buffer1[2];
	int buffer2[1];

	if (pipe (tube) != 0)	// création du tube
	{
		perror ("pipe");
		return -1;
	}
	switch (fork ())
	{
	case -1:
		perror ("fork()");
		return -1;
		break;
	case 0:
		// pocessus fils
		if (read (tube[0], buffer1, 2 * sizeof (int)) !=
		    2 * sizeof (int)) // lecture des données envoyées par le père
		{
			perror ("[Fils] read");
			return -1;
		}
		fprintf (stdout,
			 "[Fils] Lecture et addition des valeurs %d et %d\n",
			 buffer1[0], buffer1[1]);
		close (tube[0]); // fermeture du pipe en lecture
		buffer2[0] = buffer1[0] + buffer1[1]; 
		if (write (tube[1], buffer2, sizeof (int)) != sizeof (int))
		// écriture de la réponse dans le pipe
		{
			perror ("[Fils] write");
			return -1;
		}
		close (tube[1]); // fermeture du pipe en écriture
		break;
	default:
		// processus père
		buffer1[0] = 2;
		buffer1[1] = -57;
		if (write (tube[1], buffer1, 2 * sizeof (int)) !=
		    2 * sizeof (int)) // écriture des données dans le pipe
		{
			perror ("[Père] write");
			return -1;
		}
		fprintf (stdout,
			 "[Père] Envoi des valeurs %d et %d pour addition\n",
			 buffer1[0], buffer1[1]);
		close (tube[1]); // plus besoin d'envoyer des données dans le pipe, on peut le fermer
		wait (NULL); // attente de la fin du processus fils
		if (read (tube[0], buffer2, sizeof (int)) != sizeof (int))
		// lecture du résultat dans le pipe
		{ 
			perror ("[Père] read");
			return -1;
		}
		close (tube[0]); // fermeture du pipe en lecture
		fprintf (stdout, "[Père] Lectude du résultat : %d\n",
			 buffer2[0]);
		break;
	}
	return 0;
}

-> Ubuntu on a Sony Vaio VNG-FS115B
-> Wificonfig is a little script aimed to ease the switching between networks, for people who have 2 network cards : a wired one and a wireless one.

Hors ligne

#5 Le 11/12/2005, à 15:11

max63

Re : Processus père/fils en C

Voila un petit code simpa pour expliquer les pipes ... ce code réalise un ls -l | wc -l sous linux....

main () {

int tube[2], pid;
pipe(tube);

// Ici la commande Forck crée un nouveau processus 
// En mémoire le programme se divise en 2, l'un avec un pid égal 0 et l'autre avec 
// l'adresse mémoire du processus fils ( donc pid > 0 )
// Si le pid est < 0 c'est qu'il y a une erreur 
pid = fork();

if ( pid < 0 )
{
	printf("Impossible de créer un processus fils");
}else
{ 
	if ( pid == 0 ) // Processus Père
	{	
		// On ferme la sortie standart pour la redirection 
		close(1)
		// On redirige le flux pour écrire les infos dessus
		dup( tube[1] );
		// On ferme le tube en lecture
		close( tube[0] );
		// On effectue la commande ls -l
		execlp( "ls" ;"ls" ,"-l", NULL);
		close(tube[1]);
	}else // Processus fils
	{
		// On cas ou le processus est la main en premier on fait un wait
		// pour ne pas commancer 
		wait(1);
		// On ferme l'entré standart pour lire la commande du père
		close(0)
		// On redirige le flux pour lire les infos dessus
		dup(tube[0]);
		// On pense bien a fermer en écriture le tube
		close( tube[1] );
		// Et maintenant on effectue la commande
		execlp( "wc", "wc", "-l", NULL);
		// On a terminer donc on ferme le tube
		close( tube[0] );
	}
}

Tout sur l'actualité frakassante du libre : http://www.frakass.org

Hors ligne

#6 Le 05/01/2006, à 16:10

xavfab

Re : Processus père/fils en C

re bonjour!

nous en sommes à le deuxieme question de notre tp. nous devpns créer un programme permettant d'observer que les deux processus tournent en temps partagé

#7 Le 05/01/2006, à 18:19

thom

Re : Processus père/fils en C

Et bien c'est une bonne nouvelle ça...
Quelle reponse proposes-tu ?


-> Ubuntu on a Sony Vaio VNG-FS115B
-> Wificonfig is a little script aimed to ease the switching between networks, for people who have 2 network cards : a wired one and a wireless one.

Hors ligne

#8 Le 05/01/2006, à 20:42

bergi

Re : Processus père/fils en C

Pak je crois que grace a xavfab vous avez gagner le droit de chercher par vous même ^^

Hors ligne