Pages : 1
#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
Pages : 1