Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème avec fork() à la compilation

    14 août 2019 à 19:11:32

    Bonjour,

    j'ai un problème à la compilation avec le 1er programme du cours : La programmation en C sous UNIX. 

    /* Pour les constantes EXIT_SUCCESS et EXIT_FAILURE */
    #include <stdlib.h>
    /* Pour fprintf() */
    #include <stdio.h>
    /* Pour fork() */
    #include <unistd.h>
    /* Pour perror() et errno */
    #include <errno.h>
    /* Pour le type pid_t */
    #include <sys/types.h>
    
    /* La fonction create_process duplique le processus appelant et retourne
       le PID du processus fils ainsi créé */
    pid_t create_process(void)
    {
        /* On crée une nouvelle valeur de type pid_t */
        pid_t pid;
    
        /* On fork() tant que l'erreur est EAGAIN */
        do {
    	pid = fork();
        } while ((pid == -1) && (errno == EAGAIN));
    
        /* On retourne le PID du processus ainsi créé */
        return pid;
    }
    
    /* La fonction child_process effectue les actions du processus fils */
    void child_process(void)
    {
        printf(" Nous sommes dans le fils !\n"
    	   " Le PID du fils est %d.\n"
    	   " Le PPID du fils est %d.\n", (int) getpid(), (int) getppid());
    }
    
    /* La fonction father_process effectue les actions du processus père */
    void father_process(int child_pid)
    {
        printf(" Nous sommes dans le père !\n"
    	   " Le PID du fils est %d.\n"
    	   " Le PID du père est %d.\n", (int) child_pid, (int) getpid());
    }
    
    int main(void)
    {
        pid_t pid = create_process();
    
        switch (pid) {
        /* Si on a une erreur irrémédiable (ENOMEM dans notre cas) */
        case -1:
    	perror("fork");
    	return EXIT_FAILURE;
    	break;
        /* Si on est dans le fils */
        case 0:
    	child_process();
    	break;
        /* Si on est dans le père */
        default:
    	father_process(pid);
    	break;
        }
    
        return EXIT_SUCCESS;
    }
    

    Quand je veux compiler j'ai l'erreur:

    ||=== Build: Debug in PIPE (compiler: GNU GCC Compiler) ===|
    C:\Users\bernard\Documents\langage_C\FIRST_PROJECT\ESSAI_3\PIPE\main_1.c||In function 'create_process':|
    C:\Users\bernard\Documents\langage_C\FIRST_PROJECT\ESSAI_3\PIPE\main_1.c|22|warning: implicit declaration of function 'fork' [-Wimplicit-function-declaration]|
    C:\Users\bernard\Documents\langage_C\FIRST_PROJECT\ESSAI_3\PIPE\main_1.c||In function 'child_process':|
    C:\Users\bernard\Documents\langage_C\FIRST_PROJECT\ESSAI_3\PIPE\main_1.c|34|warning: implicit declaration of function 'getppid'; did you mean 'getpid'? [-Wimplicit-function-declaration]|
    obj\Debug\main_1.o||In function `create_process':|
    C:\Users\bernard\Documents\langage_C\FIRST_PROJECT\ESSAI_3\PIPE\main_1.c|22|undefined reference to `fork'|
    obj\Debug\main_1.o||In function `child_process':|
    C:\Users\bernard\Documents\langage_C\FIRST_PROJECT\ESSAI_3\PIPE\main_1.c|32|undefined reference to `getppid'|
    ||error: ld returned 1 exit status|
    ||=== Build failed: 3 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|
    


    Merci

    BB

    • Partager sur Facebook
    • Partager sur Twitter
      15 août 2019 à 9:43:03

      Bonjour,

      Es-tu sûr de suivre la bonne voie?
      Ton cours : La programmation en C sous Unix
      Ton code : tu es sous Windows.

      Si tu utilises Cygwin, ça devrait peut-être pouvoir avoir les fork (avec la demande de bibliothèque -lcygwin)
      Si tu utilise MinGW, ça ne marcheras certainement pas car Windows n'utilise pas fork pour créer des processus.

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        15 août 2019 à 10:57:05

        Oui je suis sur Windows 10 et j'utilise Code::Blocks donc je pense que c'est MinGW .

        La solution alors serait de passer sur Linux ?

        @+

        BB

        • Partager sur Facebook
        • Partager sur Twitter
          15 août 2019 à 12:25:16

          En effet, avec C::B c'est par défaut du MinGW sous Windows.

          Avec un livre typiquement prévu pour Unix tu risques d'avoir des choses qui ne fonctionneront pas sous Windows.
          Il y a peu de différences entre Unix et Linux, donc un risque nettement moindre de problèmes sous Linux.
          Peut-être que sauter le chapitre sur les fork() est une possibilité. Pour moi, en 35 ans de métiers, je les ai utilisés que quelques jours; et je fais bien de l'informatique système en C! Pour toute autre informatique ça serait moins!
          Tu peux aussi utiliser un autre livre.

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            15 août 2019 à 15:03:39

            Vous appelez un livre un cours ; Au début je me demandais ce que cela voulez dire . Mais une info intéressante: en 35 ans je l'ai  utilisé rarement, par contre les threads , les sémaphores , les mutexs et les queues ils fonctionnent bien . J'ai surtout suivi le cours pour les pipes car ça ne fonctionne pas aussi sous Windows.

            Merci pour l'info et à une prochaine.

            BB

            • Partager sur Facebook
            • Partager sur Twitter
              16 août 2019 à 13:42:08

              Bernard_A a écrit:

              Oui je suis sur Windows 10 et j'utilise Code::Blocks donc je pense que c'est MinGW .

              La solution alors serait de passer sur Linux ?

              @+

              BB


              La solution la plus simple serait d'utiliser les libs Cygwin plutôt.
              • Partager sur Facebook
              • Partager sur Twitter

              problème avec fork() à la compilation

              × 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