2010-02-08 2 views
1

Si j'ai un programme de coordonnateur de parents et un programme de travailleur, mais le programme de coordinateur crée tous les processus de travail nécessaires. Si je veux implémenter la méthode alarm() correctement pour tuer tous les processus et terminer le programme après un certain laps de temps.Comment implémenter la méthode alarm() correctement pour tuer tous les processus de travail créés par fork()?

Est-ce la bonne façon de l'implémenter? La façon dont je l'ai actuellement, il affiche maintenant le message printf() correspondant au message pour les processus de travail en train d'être détruits.

Remarque: J'ai mis en œuvre l'ignorance des signaux d'interruption afin que plus de processus de travail puissent continuer sans souci.

int main(int argc, char** argv) 
{ 
signal(SIGINT, sig_ctrl); 
signal(SIGALRM, sig_alarm); 

alarm(5); 
sleep(10); 

    //rest of program which creates the needed processes 

} 

void sig_ctrl(int sig) 
{ 
printf("Hold on buddy, you're not terminating this program with CTRL^C.\n"); 
} 

void sig_alarm(int sig) 
{ 
sleep(0); 
fflush(stdout); 
printf("The alarm is sounding, all worker procceses will be...TERMINATED!"); 
raise(SIGTERM); 
} 

Répondre

2

Il y a la manière facile, qui est discutablement la manière bâclée, et la manière dure. La méthode la plus simple consiste à s'assurer que le processus initial est le leader du groupe de processus, qu'il ignore un signal approprié (mais que ses enfants n'ignorent pas le signal), puis envoie le signal au groupe de processus. Le chemin le plus difficile requiert une liste de tous les processus enfants, et le parent peut alors envoyer un signal à chacun des processus, en supprimant ceux qui sont morts de sa liste.

0

J'ai eu le même type de problème dans certains devoirs pour une unité unix. C'est à peu près la solution la plupart des gens sont venus avec: P

1

problème de votre programme est que le sommeil() est généralement mis en œuvre à l'aide de la minuterie SIGALRM, donc appeler l'emporte probablement votre signal() réglage pour SIGALRM

$ l'homme 3 sommeil

 
BUGS 
     sleep() may be implemented using SIGALRM; mixing calls to alarm(2) and 
     sleep() is a bad idea. 

(BTW, Le sleep(0) est un non-sens aussi. Qu'est-ce que vous essayez d'atteindre avec ça?)

Questions connexes