Partage
  • Partager sur Facebook
  • Partager sur Twitter

Processus Pere/Fils fork()

Linux

Sujet résolu
20 septembre 2009 à 11:28:29

Bonjour,
J'essaye de comprendre en ce momen, le principe des pipe, seulement, avec ce code, j'ai un probleme, il ne me fait pas ce qu'il devrait, c'est à dire:
-Le pere envoi au fils "Salut filston"
-Le fils lis ces données et les affiche à l'écran
-Le fils envoi au pere "Reçu 5 sur 5"
-Le pere affiche ce message

Donc, voici mon code:
#include <stdio.h>
#include <memory.h>
#include <unistd.h>

int main(int argc, char **argv)
{
	/* Création du pipe */
	int pfd[2];
	if(pipe(pfd) == -1)
	{
		printf("pipe failed\n");
		return 1;
	}

	/* Création du processus fils */
	int pid;
	if( (pid = fork()) < 0 )
	{
		printf("fork failed\n");
		return 2;
	}

	if (pid == 0)
	{
		/* processus enfant */
		char buffer[BUFSIZ];

			close(pfd[1]); /* Fermeture du coté ecriture */
		
		/* Lecture des données envoyées par le pere */
		while(read(pfd[0], buffer, BUFSIZ) != 0)
			printf("child reads %s", buffer);
		
		close(pfd[1]); /* Fermeture du côté lecture */
		
		/* Envoi de l'accusé de reception */
		strcpy(buffer, "OK, reçu 5 sur 5\n");
		write(pfd[1], buffer, strlen(buffer) + 1);

		/* Fermeture du pipe */
		close(pfd[1]);
	}
	else
	{
		/* Processus pere */
		char buffer[BUFSIZ];

		close(pfd[0]); /* Fermeture du coté lecture */

		/* Envoi de données vers le processus Fils */
		strcpy(buffer, "Salut Filston!\n");
		write(pfd[1], buffer, strlen(buffer) + 1);

		/* Fermeture du coté ecriture */
		close(pfd[1]);

		/* Reception de l'acusé */
		while(read(pfd[0], buffer, BUFSIZ) != 0)
			printf("father reads %s", buffer);

		/* Fermeture du coté lecture */
		close(pfd[0]);
	}
	return 0;
}


Seulement, il m'affiche sans arrêt "salut filston" :(

Je pense que le probleme vient du fait que dans le processus enfant, le coté ecriture est fermé, puis que j'essai d'écrire dedans :-°

Si vous pouvez m'expliquer, là où ça bloque, parce-que là je suis un peu perdu :euh:

Merci :)
  • Partager sur Facebook
  • Partager sur Twitter
- Il y a un chemin vers chaque sommet, même le plus haut -
20 septembre 2009 à 11:43:19

Tu as beaucoup trop de fonctions close() :p
Si tu fermes le pipe avant d'écrire ou de lire dedans, ça ne marche pas :)
  • Partager sur Facebook
  • Partager sur Twitter
20 septembre 2009 à 11:47:42

ben oui, mais je suis obligé de fermer le côté ecriture dans le processus fils, si je veux lire dedans, sinon, ça donne lieux à des cas indéterminé :-°

Seulement, je ne sais pas comment le rouvrir apres pour envoyer l'accusé de reception au pere :euh:
  • Partager sur Facebook
  • Partager sur Twitter
- Il y a un chemin vers chaque sommet, même le plus haut -
20 septembre 2009 à 11:53:20

Il te faut 2 pipes, 1 pere -> fils et l'autre fils-> pere.
Les pipes UNIX sont unidirectionels.
Donc tu fait 2 appels à pipe(), dans le fils tu fermes le côté écriture du pipe pere->fils, et le côté lecture du pipe fils->pere.
Et tu fait l'inverse dans le process père.
  • Partager sur Facebook
  • Partager sur Twitter
20 septembre 2009 à 13:11:03

Genial, Neo66, ça marche impec :)

voici mon nouveau code:

#include <stdio.h>
#include <memory.h>
#include <unistd.h>

int main(int argc, char **argv)
{
	/* Création du pipe */
	int pfd[2];
	int pfd_2[2];

	if(pipe(pfd) == -1)
	{
		printf("pipe failed\n");
		return 1;
	}

	if(pipe(pfd_2) == -1)
	{
		printf("pipe failed\n");
		return 1;
	}

	/* Création du processus fils */
	int pid;
	if( (pid = fork()) < 0 )
	{
		printf("fork failed\n");
		return 2;
	}

	if (pid == 0)
	{
		/* processus enfant */
		char buffer[BUFSIZ];

		close(pfd[1]); /* Fermeture du coté ecriture de pfd */
		close(pfd_2[0]); /* Fermeture du coté lecture de pfd_2 */
		
		/* Lecture des données envoyées par le pere */
		while(read(pfd[0], buffer, BUFSIZ) != 0)
			printf("child reads %s", buffer);
		
		close(pfd[1]); /* close the pipe */
		
		/* Envoi de l'accusé de reception */
		strcpy(buffer, "OK, reçu 5 sur 5\n");
		write(pfd_2[1], buffer, strlen(buffer) + 1);

		/* Fermeture du pipe */
		close(pfd_2[1]);
	}
	else
	{
		/* Processus pere */
		char buffer[BUFSIZ];

		close(pfd[0]); /* Fermeture du coté lecture de pfd */
		close(pfd_2[1]); /* Fremeture du coté ecriture de pfd_2 */

		/* Envoi de données vers le processus Fils */
		strcpy(buffer, "Salut Filston!\n");
		write(pfd[1], buffer, strlen(buffer) + 1);

		/* Fermeture du coté ecriture */
		close(pfd[1]);

		/* Reception de l'acusé */
		while(read(pfd_2[0], buffer, BUFSIZ) != 0)
			printf("father reads %s", buffer);

		/* Fermeture du coté lecture */
		close(pfd_2[0]);
	}
	return 0;
}



Merci encore pour cette précieuse aide :)
  • Partager sur Facebook
  • Partager sur Twitter
- Il y a un chemin vers chaque sommet, même le plus haut -
21 mai 2018 à 17:36:53

Pourriez-vous mettre des commentaires car je ne comprends pas tout le code, a partir des créations des deux pipes je ne comprends pas, merci.
  • Partager sur Facebook
  • Partager sur Twitter
21 mai 2018 à 17:46:48

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Déterrage

Citation des règles générales du forum :

Avant de poster, demandez-vous si ce que vous allez dire apporte quelque chose au sujet. Si votre message n'apporte rien, vous ferez perdre du temps à tout le monde et le sujet pourrait dévier ou devenir difficile à suivre.

Aussi, vérifiez la date du topic. Le déterrage de topic nuit au bon fonctionnement du forum et est interdit. Utilisez les boutons pouce en haut pour dire merci. Si le topic date de plus de deux mois sans réponses, mieux vaut ne pas répondre. Si vous avez une question similaire, créez plutôt votre propre sujet en détaillant votre contexte

Je ferme ce sujet.

  • Partager sur Facebook
  • Partager sur Twitter