Accueil > Forum > > > > fork(), kill() et wait() ...
fork(), kill() et wait() ...
jeudi 15 novembre 2007 à 01:06:05 |
fork(), kill() et wait() ...

LocalStone
|
Salut à tous,
Alors voilà, je suis face à un problème qui me prend la tête depuis au
moins une heure, mais je ne trouve vraiment pas de solution ni
d'explication. Je suis sur que c'est pas grand chose, mais bon ...
En fait, je débute en programmation système et donc là j'en suis au
routage des signaux. Donc j'ai en fait un processus père, qui crée un
processus fils. Dans le processus père, je déroute le signal SIGTERM
pour qu'un message soit affiché lorsqu'il reçoit un tel signal. C'est
le fils qui s'occupe d'envoyer le signal ...
En fait, c'est pas ça qui me pose un soucis, mais c'est la
synchronisation à la fin entre le père et le fils : je veux que le père
se termine uniquement lorsque le fils est terminé. Il n'y a qu'un seul
fils, donc j'utilise qu'un seul wait. Pourtant, lorsque le fils envoie
SIGTERM au père, le wait est débloqué ... Comment cela ce fait-ce ?
D'après le peu que j'ai lu, cela est du au fait que le wait attend non
pas la fin d'un processus, mais son changement d'état ... Mais j'avoue
que j'ai pas trop compris en quoi le fait de lancer un signal
correspond à un changement d'état.
Si quelqu'un peut m'expliquer, ce serait vraiment sympa !
Je met en annexe mon petit bout de code : #include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/wait.h>
#define TEMPS_ATTENTE 5
void executerReactionSignal(int);
int main(void)
{
pid_t intPidPere, intPidFils;
intPidPere = getpid();
intPidFils = fork();
switch(intPidFils)
{
case -1 :
printf("[Père#%d] Il y a eu une erreur lors du fork(). \n", intPidPere);
exit(-1);
break;
case 0 :
intPidFils = getpid();
intPidPere = getppid();
printf("[Fils#%d] Je suis Fils#%d, issu de Père#%d ! \n", intPidFils, intPidFils, intPidPere);
printf("[Fils#%d] J'envoie le signal %d à Père#%d dans %d
secondes. \n", intPidFils, SIGTERM, intPidPere, TEMPS_ATTENTE);
sleep(TEMPS_ATTENTE);
if(kill(intPidPere, SIGTERM) == -1)
{
printf("[Fils#%d] Erreur lors de l'envoi du signal %d à Père#%d. \n", intPidFils, SIGTERM, intPidPere);
}
else
{
printf("[Fils#%d] Signal %d envoyé ! \n", intPidFils, SIGTERM);
}
sleep(TEMPS_ATTENTE);
printf("[Fils#%d] J'envoie le signal %d à Père#%d dans %d
secondes. \n", intPidFils, SIGTERM, intPidPere, TEMPS_ATTENTE);
sleep(TEMPS_ATTENTE);
if(kill(intPidPere, SIGTERM) == -1)
{
printf("[Fils#%d] Erreur lors de l'envoi du signal %d à Père#%d. \n", intPidFils, SIGTERM, intPidPere);
}
else
{
printf("[Fils#%d] Signal %d envoyé ! \n", intPidFils, SIGTERM);
}
printf("[Fils#%d] J'ai fini ! \n", intPidFils);
exit(0);
break;
default :
printf("[Père#%d] Je suis Père#%d ! \n", intPidPere, intPidPere);
struct sigaction stcReaction;
stcReaction.sa_handler = executerReactionSignal;
stcReaction.sa_flags = 0;
printf("[Père#%d] Je déroute le signal %d. \n", intPidPere, SIGTERM);
if(sigaction(SIGTERM, &stcReaction, NULL) == -1)
{
printf("[Père#%d] Il y a eu une erreur lors de sigaction() pour le signal %d. \n", intPidPere, SIGTERM);
}
printf("[Père#%d] Je déroute le signal %d. \n", intPidPere, SIGKILL);
if(sigaction(SIGKILL, &stcReaction, NULL) == -1)
{
printf("[Père#%d] Il y a eu une erreur lors de sigaction() pour le signal %d. \n", intPidPere, SIGKILL);
}
printf("[Père#%d] J'attends Fils#%d. \n", intPidPere, intPidFils);
wait(NULL); // Pourquoi l'envoi d'un signal de la part du fils débloque le wait ? Comment faire pour palier à ça ?
wait(NULL);
printf("[Père#%d] Fils#%d s'est terminé. \n", intPidPere, intPidFils);
break;
}
return 0;
}
void executerReactionSignal(int intSignal)
{
pid_t intPidPere = getpid();
printf("[Père#%d] Je viens de recevoir le signal %d. \n", intPidPere, intSignal);
}
Merci beaucoup pour votre aide ! LocalStone
|
|
mardi 5 février 2008 à 14:17:58 |
Re : fork(), kill() et wait() ...

adduke
|
Salut,
Si ça peut d'aider ... http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/pause.2.html http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/wait.2.html http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man/manfr.php?ptd=man3/index.html
Dixit 'WAIT' :
La fonction
wait suspend l'exécution du processus courant jusqu'à ce qu'un enfant se termine, OU jusqu'à ce qu'un signal à intercepter arrive.
@+, Dukyduke
|
|
Cette discussion est classée dans : printf, fils, signal, père, intpidpere
Répondre à ce message
Sujets en rapport avec ce message
Faire remonter une valeur avec un signal [ par Cedric477 ]
Bonjour à tous, J'espère être dans la bonne section pour créer ce topic. J'ai bien cherché sur internet, mais je n'ai rien trouvé de concluant...
les pipes [ par maciass ]
slt svp est ce que qlq un peut m expliquer comment créer un pipe(tube) pour faire communiquer deux processus père et fils (le père envoie une chaine
La hierarchie pere et fils [:(] !!!!!!!!!!!! HELP!!!!!!!!!!! [ par laetitia334 ]
bonjour a tous! j'ai un probleme avec un programme! car je ne comprend pas les termes utilisés:Main (){int pid;printf("je suis le processus initial \n
Fork langage C [ par lozxxx ]
Bonjour, je suis débutant en programmation j aimerais savoir comment créer un programme père qui crée 2 fils, chaque fils crée deux fils, chaque proce
les tubes et les fork() [ par maciass ]
slt svp est ce que qlq un peut m expliquer comment créer un pipe(tube) pour faire communiquer deux processus père et fils (le père envoie une chaine
need help [ par nlepe ]
Le problème est le suivant : On cherche a faire un serveur de calcul qui effectue deux opérations l'addition et la multiplication mais en utilisant le
[Programmation système] Comment synchroniser des signaux entre processus? [ par biglittlekiss ]
Bonjour,Voila je fait cet exercice et je bloque sur l'execution ens équence des processus.Exercice:Un processus père, construit 2 processus fils, plac
comment envoyer un signal du pere au fils pour faire un traitement [ par facilus ]
Bonjour,je voudrai faire un programme qui crée un processus fils qui affiche un message quand il reçoit lesignal SIGUSR1 du processus père.merci
modification et afichage des noeuds d'un arbre en C++ [ par isil4 ]
Bonjour;Je ne comprend pas ou est le problème;je suis sur le cryptage de Huffman, dans la phase affectation codes, en ce moment, mon programme affecte
tableau [ par ngabou98 ]
bonjour à tous c'est encore moi svp j'ai besoin de votre aide je travaille sur la méthode de simplification d'une fonction booléene par la méthode de
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|