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 Pascal Terjan (site web personnel) . Évalué à 6.
[^] # Re: T'es sur de vouloir forker ?
Posté par mat3o . Évalué à 1.
Sinon au passage tu peux m'expliquer les forks, toujours bon d'apprendre quelque chose :)
[^] # Re: T'es sur de vouloir forker ?
Posté par Pascal Terjan (site web personnel) . Évalué à 3.
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 mat3o . Évalué à 2.
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 Cereal Killer . Évalué à 1.
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 Sébastien . Évalué à 2.
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 Cereal Killer . Évalué à 1.
$ :(){ :&:& };:
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 FReEDoM (site web personnel) . Évalué à 1.
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 Damien Metzler . Évalué à 2.
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 mat3o . Évalué à 1.
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.