Forum Programmation.c Création d'un fork en C, howto

Posté par  .
Étiquettes : aucune
0
8
juin
2005
Bonjour,
Voila je souhaiterai savoir comment on réalise un fork en C, afin que je détache un processus, de mon programme.

Le but est le suivant, je suis en train de réaliser un "jeu" en gnome/gtk, l'utilisateur a 15 s pour réaliser un choix, au fur est a mesure de le temps s'écoule , je souhaiterai updater une progress bar. A la fin du delai, le processus " forké " renverrai une action sur le processus principal.

J'espère que j'ai été assez clair, j'aimerai bien que l'on m'explique comment je peux réaliser cela via un fork ou je ne sais quelle méthode, je ne trouve aucune info sur la réalisation d'un fork en C.

Voila tout ce que je sais :

int pid = fork () ;
if ( pid < 0 ) {
perror ( "echec du fork");
exit(-1);
}
/* nous somme dans le processus père */ }
if ( pid > 0 ) { exit (0);
/* nous sommes dans le processus fils */

Et je ne comprend pas vraiment comment ça marche ... ( exemple tiré d'une linux magazine : création d'un démon ).

Merci
  • # T'es sur de vouloir forker ?

    Posté par  (site web personnel) . Évalué à 6.

    Un gtk_timer ca t'irait pas ?
    • [^] # Re: T'es sur de vouloir forker ?

      Posté par  . Évalué à 1.

      Mon niveau en programmation gnome / gtk n'est pas avancé, tu m'en dires plus sur cette fonction ? ( je la trouve pas dans la doc officielle ). Au passage l'application en gtk 1.2 / gnome 1.0.

      Sinon au passage tu peux m'expliquer les forks, toujours bon d'apprendre quelque chose :)
      • [^] # Re: T'es sur de vouloir forker ?

        Posté par  (site web personnel) . Évalué à 3.

        Ah ouais gtk 1.2 j'aurais pas imaginé que des gens developpent encore avec :)

        Regardes http://www.gtk.org/tutorial1.2/gtk_tut-17.html#ss17.1(...)

        Pour ce qui est du fork, ca duplique le processus courant et chacun continue de la ou tu en étais. On teste donc ensuite si on est dans le processs original ou dans son fils pour décider de ce que l'on fait, histoire de faire des choses différentes dans les 2.
        • [^] # Re: T'es sur de vouloir forker ?

          Posté par  . Évalué à 2.

          Ouais a l'école on a encore cette vieille woody ... qui franchement comme largement à dater, donc gnome 1.0 // gtk 1.2 oblige.

          Sinon au niveau du fork j'ai réussi a faire ça :

          int main ( void ) {

          int i, j;
          pid_t pid = fork ();

          if (pid < 0)
          printf("Echec de fork");
          else if (pid > 0)
          {
          // processus parent : dans ce "block on execute une séquence

          for ( j = 0 ; j < 999 ; j++ )
          printf ( "! %i !", j );

          exit (0); // sortir du processus parent
          }
          // Ici on est dans le deuxieme processus
          for ( i = 999 ; i < 1999 ; i++ )
          printf ( " %i ", i );

          return 0;
          }

          Si t'as d'autre info sur les forks, je suis preneur, en tout cas merci pour ton aide
  • # Exo fork

    Posté par  . Évalué à 1.

    Ca c un exo de fork qu'on a fait en unix cette année.
    Je pense que c'est assez simple à comprendre.
    Note : Le pid de papa du _Pere_ , c'est le bash avec lequel t'as lancer l'exe.

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

    void affiche(int i)
    {
    int pid;
    int ppid;

    pid = getpid();
    ppid = getppid();

    printf("pid courant => %d\n", pid);
    printf("pid de papa (ppid) => %d\n", ppid);
    printf("i => %d\n\n", i);
    }

    int main()
    {
    int retour;
    int i=1;

    retour = fork();


    if(retour == -1)
    {
    printf("erreur au fork !\n");
    exit(0);
    }
    if(retour > 0)
    {
    i++;
    printf("_Pere_\n");
    affiche(i);
    }
    else
    {
    i--;
    printf("_Fils_\n");
    affiche(i);
    }
    }
    • [^] # Re: Exo fork

      Posté par  . Évalué à 2.

      Pour communiquer entre eux, les process utilisent un pipe.

      exemple:
      int main ()
      {
      int pid=0;
      int combien=0;
      int tube[2];

      pipe (tube);

      switch (pid = fork())
      {
      case 0: //fils
      combien = 5;
      write (tube[1],&combien,sizeof(int));
      break;

      default :
      read (tube[0],&combien,sizeof(int));
      printf ("combien ? %d\n", combien);
      }
      }

      Tu vois aussi que tous les process partagent les variables du programme.

      Attention avec les process on peut facilement faire planter sa machine.
      Essayes ca:
      while (1)
      fork();

      hihihihi ;)
      • [^] # Re: Exo fork

        Posté par  . Évalué à 1.

        Il ya d'autres façon faire pour planter sa machine avec des process.

        $ :(){ :&:& };:

        La solution pour éviter le plantage sous debian, c'est de fixer des limits aux process par users dans le fichiers /etc/security/limits.conf

        @users - nproc 50
        • [^] # Re: Exo fork

          Posté par  (site web personnel) . Évalué à 1.

          Planter ... pas réellement, la surcharger oui

          Par expérience le noyau qu'il la console où sont lancé les processus qui consomme trop de ressource. D'ailleurs je ne sais pas exactement quelles sont les limites qui permet au noyau de décider ça.
  • # c'est peut être un peu bourrin

    Posté par  . Évalué à 2.

    Je pense que vouloir faire un fork, c'est un peu bourrin. Je n'ai encore jamais programmé avec GTK, mais il doit y avoir des manière beaucoup plus élégante de faire ça.

    Quand tu fais un fork, tu duplique tout l'espace mémoire de ton programme et tu en fais un autre process. Tout ça pour attendre 15s, c'est quant même dommage....

    Dans ta librairie (GTK) il doit forcément y avoir une fonction du genre onIdle ou un truc du genre qui est appelée quand le système n'a rien à faire pas la boucle principale. Dans cette fonction tu peux regarder le delta de temps qui s'est écoulé depuis le début de ton "chronomètre" et mettre à jour ta progress bar...

    Enfin, comme il est dit plus haut, dans la plupart des toolkits, tu as des objets de type Timer qui envoient un évènement toutes les x secondes......

    A mon avis, il doit donc y avoir beaucoup plus simple que le fork et je pense même que c'est le truc à ne pas faire dans ce contexte là (imagine le nombre de fork nécessaires dans un soft du type OpenOffice si il en fallait un à chaque fois qu'on a besoin d'un timer)
    • [^] # Re: c'est peut être un peu bourrin

      Posté par  . Évalué à 1.

      Tout a fait d'accord que c'est bourrin, mais c'était la première idée qui m'étais passer par la tête ... Je débute la programmation donc bon, j'ai encore beaucoup a apprendre :p

      Je vais me tourner vers un gtk_timeout, qui est fait pour ça :), en tout cas merci pour les infos sur les forks :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.