Fork() waitpid() ????

Résolu/Fermé
tigrouzzz6 Messages postés 41 Date d'inscription mardi 6 février 2007 Statut Membre Dernière intervention 22 juin 2008 - 2 août 2007 à 23:01
 samuel - 29 nov. 2007 à 17:48
Bonjour, qqn pourrais t il m envoyer un bout de code avec un fork et un waitpid() svp que je vois comment ca marche????
je voudrai lancer le script B qd le A se termine...donc je pensais faire un fork() ds A et wait pid() ds B....
est il possible de ne pas toucher au script de la fonction mais d utiliser le nom de la fonction à lancer (ficher.sh)????
merci bcp à ceux qui repondront;.....

8 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
3 août 2007 à 00:18
Salut,

Tu ne peux pas utiliser fork et waitpid dans un script sh. Ces fonctions s'utilisent dans un programme compilé, la plupart du temps en C, ou alors dans un langage de script plus puissant comme le python ou le perl.... Bref dans un langage qui a accés aux fonctions de base du système.

Tu peux faire deux choses sachant que A et B sont des scripts shell:

_ Dans B, tu appelles A au début et là forcément le reste de B s'executera après A.
_ Tu crées un script C qui appelle A puis B.
_ Ou alors tu fais un programme avec fork et waitpid qui execute ces scripts. Le père crées un fils de lui-même (fork) qui executera A. Dans le père, avec waitpid tu attends que le fils soit terminé, puis tu lances B:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
    pid_t pid_fils;
    int statut;
    if( (pid_fils=fork()) == 0){ //On est dans le fils
        execl("/bin/bash", "/bin/bash", "./A", NULL);
    }
    else if(pid_fils == -1){
        //Erreur
    }
    else{ //On est dans le parent
        if(waitpid(pid_fils, &statut, 0) == -1){
            //Erreur
        }
         else{// Le fils s'est terminé
             execl("/bin/bash", "/bin/bash", "./B", NULL);
         }
     }
     return 0;
}

5
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
3 août 2007 à 10:30
Oh, merci pour l'info, je connaissais pas le wait...
2
Je crois plutôt que wait attend la mort d'un de ses fils mais n'attend pas la mort de tous ces fils.

http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/wait.2.html
1
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
3 août 2007 à 10:28
Hello
L'équivalent en shell:

commande_en_backgroud &
wait

wait attends toutes les tâches en backround ou wait PID pour attendre une tâche spécifique
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tigrouzzz6 Messages postés 41 Date d'inscription mardi 6 février 2007 Statut Membre Dernière intervention 22 juin 2008 1
3 août 2007 à 17:45
merci bcp kilian pour les infos..j connais pa le execl mais j irai faire un petit man pour comprendre..j suppose que ca execute...
merci en tout cas
@bientot
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
3 août 2007 à 17:49
Ca ne fait pas que executer, ça transforme carrément le processus courant en un autre processus.
0
tigrouzzz6 Messages postés 41 Date d'inscription mardi 6 février 2007 Statut Membre Dernière intervention 22 juin 2008 1
3 août 2007 à 17:53
Par contre tu dis qu en shell j peux pas l utiliser...je suis debutant la dedans...il faut donc que j cree un .c???que j compile etc???
merci
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
3 août 2007 à 18:02
Inutile de passer par le C si tu n'en as pas besoin.
Comme je t'ai dit, tu peux lancer un script B uniquement après avoir attendu la fin d'un script A sans problème avec le shell.
0