Partage
  • Partager sur Facebook
  • Partager sur Twitter

Execv()+fork()+pipe()

Enfant qui envoit un message au parent

    27 mars 2020 à 17:04:09

    Bonjour,

    Avant d'expliquer mon problème voici ce que j'essaie de faire tout simplement:

    J'ai deux programme, dans le premier je lance le deuxième programme (en utilisant un fork() + execv()), puis j'essaie de les faire communiquer en utilisant les pipes.

    Mon problème: J'arrive à lire le message qui vient du parent vers le fils, mais je n'arrive pas à lire le message envoyé depuis le fils.

    Code parent.c :

      #include <stdio.h>
      #include <memory.h>
      #include <unistd.h>
    
    int main()
    {
    
      //int status;
      int  pfd[2] /*Du père vers le fils*/ ,pfd2[2]/*Du fils vers le père*/;
    
      if (pipe(pfd) == -1)
      {
       printf("pipe failed\n");
       return 1;
     }
     
    if (pipe(pfd2) == -1)
      {
       printf("pipe failed\n");
       return 1;
     }
    
    
    
     int  pid;
     if ((pid = fork()) < 0)
     {
       printf("fork failed\n");
       return 2;
     }
     
    
     if (pid == 0)
     {
         /* child */
        //dup2(pfd2[1],STDOUT_FILENO);
        close(pfd[1]);
        close(pfd2[0]);
        char* arr[] = {"Dest", pfd, pfd2, NULL};
        execv("/home/Moi/enfant.c", arr);
     }
     else
     {
         /* parent */
    
        char sendMessage[BUFSIZ];
        char readmessage[20];
        close(pfd[0]); 
        close(pfd2[1]); 
        strcpy(sendMessage, "Salut Fiston\n");
        printf("In Parent: Message to send- %s\n", sendMessage);
        write(pfd[1], sendMessage, strlen(sendMessage)+1);
        wait(NULL);
        read(pfd2[0], readmessage, sizeof(readmessage))!=0;
        printf("In Parent: Reading from pipe 2 – Message is %s\n", readmessage) !=0;
        close(pfd[1]);
        close(pfd2[0]);
      
     }
    
     //printf("Finish\n");
     return 0;
    }   

    Code enfant.c qui va être appelé:

    #include <stdio.h>
    #include <memory.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
    
    	char readmessage[BUFSIZ];
    	char pipe2sendMessage[20] = "Salut Parent\n";
    	read(argv[1][0], readmessage, BUFSIZ) != 0;
    
    	printf("In Child: Message recu de Parent- %s\n", readmessage);
    	printf("In Child: MSG to send- %s", pipe2sendMessage);
    	write(argv[2][1], pipe2sendMessage, sizeof(pipe2sendMessage));
    	
    	close(argv[1][0]);
    	close(argv[2][1]); 
    
    	return 0;
    }

    J'ai déjà essayé d'utiliser la fonction dup2, mais celui la me permet de récupérer ce qui devrait être affiché en stdout. Mais je souhaite aussi afficher dans la console à partir de mon enfant.c. Je voulais savoir quel est le problème et s'il y aurait une solution.

    Je vous remercie d'avance  pour votre aide.




    -
    Edité par Silverlight_X 27 mars 2020 à 17:05:47

    • Partager sur Facebook
    • Partager sur Twitter
      27 mars 2020 à 18:32:55

      Je pense que tu dois fermer certains pipe. Voici un lien qui explique comment faire:
      http://www.zeitoun.net/articles/communication-par-tuyau/start
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        27 mars 2020 à 18:46:49

        Salut, merci de ta réponse. J'avais déjà vu ce site (très bien expliqué au passage !). J'ai vérifié mon code, les pipes en questions sont bien fermé. Merci encore :)
        • Partager sur Facebook
        • Partager sur Twitter

        Execv()+fork()+pipe()

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown