Προς το περιεχόμενο

Λειτουργικα Συστηματα


fonsde

Προτεινόμενες αναρτήσεις

Δημοσ.

Θέλω η parent να δημιουργεί n workers. Αφου δημιουργηθούν όλοι να στέλνει ενα signal στο τελευταίο child-worker. Μετά θέλω να περιμένει την ολοκλήρωση όλων το workers . Θα ΠΡΕΠΕΙ ωστόσο να ελέγχει το status της wait ώστε σε περίπτωση που ενας worker δεν τερμάτισε επιτυχώς να τερματίζει τους άλλους με signal SIGKILL

 

>for (i=0;i<n;i++){
	if ((pid[i] = fork()) < 0) {
		perror("fork");
		exit(1);}
	if (pid[i]==0)
		break;
}

if (pid[i] == 0){      /////CHILD/////  
	signal(SIGUSR1,handler); 
	signal(SIGKILL, sigkill);

	}
else{                /////PARENT/////
             kill(pid[n-1],SIGUSR1);

	for (i=0;i<n;i++){
		if(wait(&status) != pid[i]) {
			perror("wait");
			exit(1);
		}

		if((status & 0377) == 0) {
			printf("+++ Parent: Child Exited Normally: %d\n", status >> 8);
		} else {
			printf("+++ Parent: Child Exited due to signal: %d\n", status & 0177);
		}
	}
}

 

εχω κανει τετοιο αλλα δεν ξερω πως να χρησιμοποιήσω τα wait,sleep,pause ?

Δημοσ.

Δεν είμαι σίγουρος εάν έχω καταλάβει καλά το πρόβλημα αλλά σου προτείνω την παρακάτω λύση:

 

>
for (i=0;i<n;i++) {
       if ((pid[i] = fork()) < 0) {
           perror("fork");
           exit(1);}
       if (pid[i]==0) [color="Red"]{ /////CHILD///// 
           signal(SIGUSR1,handler); 
           signal(SIGKILL, sigkill);
           break;
       }[/color]
   }

[color="Red"]for (i=0;i<n;i++) {[/color]
   if (pid[i] == 0){      /////CHILD/////  
[color="Red"]        pause ();[/color]
   }
   else{                /////PARENT/////
       [color="Red"]if (i == n-1) {[/color]
           kill(pid[n-1],SIGUSR1);

           [color="Red"]for (i=0;i<n;i++){[/color]
               if( [color="Red"](pid_c = wait(&status)) < 0 [/color]) {
                   perror("wait");
                   exit(1);
               }

               if((status & 0377) == 0) {
                   printf("+++ Parent: Child Exited Normally: %d\n", status >> 8);
               } else {
                   printf("+++ Parent: Child Exited due to signal: %d\n", status & 0177);
[color="Red"]                    /* kill rest of childs */
                   for (i=0;i<n;i++) {
                       if (pid[i] != pid_c)
                           kill(pid[i], SIGKILL);
                   }[/color]
               }
           }
       }
   }

Δημοσ.
thank you, σωστό μου φαίνεται. δηλαδή κάθε παιδί είναι σε pause, μέχρι να πάρει ένα signal έτσι ?

 

Ακριβώς έτσι. Το μόνο που δεν κατάλαβα είναι πιο signal πρέπει να στείλει ο πατέρας στο τελευταίο παιδί. Γιατί με το SIGUSR1 η wait() επιστρέφει με το status να ικανοποεί την πρώτη συνθήκη, δηλαδή να τερματίζει χωρίς κανένα πρόβλημα, με αποτέλεσμα ο πατέρας να περιμένει για πάντα τα υπόλοιπα παιδιά. Μήπως ο πατέρας πρέπει να στείλει SIGKILL αρχικά στο τελευταίο παιδί;

Δημοσ.

κοιτα πως παει ο πατερας στελνει SIGUR1 στο τελευταιο και μολις το παρει το τελευταιο παιδι στελνει SIGUR1 στο προτελευταιο , με την σειρα του το προτελευταιο στο προπρο . Μεχρι να το παρει και το 1ο παιδι.

 

 

//επίσης σκέψου πως κάθε παιδί θα κάνει κάτι(θα κρυπτογραφεί ένα μέρος ενός κείμενου), πρέπει η parent να περιμένει μέχρι να ολοκληρώσουν όλες αυτό το κάνει?

 

 

99416580.jpg εκφώνηση

Δημοσ.

Μάλλον όχι (κάνει λιγότερα), γιατί ο πρόβλημα που διατυπώθηκε στο πρώτο post είναι λίγο διαφορετικό από το ^ αποπάνω ^. Αυτό που δεν καταλαβαίνω ^ στην αποπάνω ^ διατύπωση έιναι η κλήση exec, που αναφέρεται;

 

Υ.Γ.: Πάντως μπορείς να βασιστείς στον κώδικα που σου έδωσα και να τον επεκτείνεις.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...