fonsde Δημοσ. 24 Νοεμβρίου 2009 Δημοσ. 24 Νοεμβρίου 2009 Θέλω η 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 ?
bab1s Δημοσ. 24 Νοεμβρίου 2009 Δημοσ. 24 Νοεμβρίου 2009 Δοκίμασε να δείς πρώτα εδώ man 2 wait man sleep man pause ή εδώ (ουσιαστικά ίδια με παραπάνω αλλά στο idernet) http://www.opengroup.org/onlinepubs/009695399/functions/wait.html http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html http://www.opengroup.org/onlinepubs/009695399/functions/pause.html
pinball_elf Δημοσ. 24 Νοεμβρίου 2009 Δημοσ. 24 Νοεμβρίου 2009 Δεν είμαι σίγουρος εάν έχω καταλάβει καλά το πρόβλημα αλλά σου προτείνω την παρακάτω λύση: > 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] } } } }
fonsde Δημοσ. 24 Νοεμβρίου 2009 Μέλος Δημοσ. 24 Νοεμβρίου 2009 thank you, σωστό μου φαίνεται. δηλαδή κάθε παιδί είναι σε pause, μέχρι να πάρει ένα signal έτσι ?
pinball_elf Δημοσ. 24 Νοεμβρίου 2009 Δημοσ. 24 Νοεμβρίου 2009 thank you, σωστό μου φαίνεται. δηλαδή κάθε παιδί είναι σε pause, μέχρι να πάρει ένα signal έτσι ? Ακριβώς έτσι. Το μόνο που δεν κατάλαβα είναι πιο signal πρέπει να στείλει ο πατέρας στο τελευταίο παιδί. Γιατί με το SIGUSR1 η wait() επιστρέφει με το status να ικανοποεί την πρώτη συνθήκη, δηλαδή να τερματίζει χωρίς κανένα πρόβλημα, με αποτέλεσμα ο πατέρας να περιμένει για πάντα τα υπόλοιπα παιδιά. Μήπως ο πατέρας πρέπει να στείλει SIGKILL αρχικά στο τελευταίο παιδί;
fonsde Δημοσ. 24 Νοεμβρίου 2009 Μέλος Δημοσ. 24 Νοεμβρίου 2009 κοιτα πως παει ο πατερας στελνει SIGUR1 στο τελευταιο και μολις το παρει το τελευταιο παιδι στελνει SIGUR1 στο προτελευταιο , με την σειρα του το προτελευταιο στο προπρο . Μεχρι να το παρει και το 1ο παιδι. //επίσης σκέψου πως κάθε παιδί θα κάνει κάτι(θα κρυπτογραφεί ένα μέρος ενός κείμενου), πρέπει η parent να περιμένει μέχρι να ολοκληρώσουν όλες αυτό το κάνει? εκφώνηση
pinball_elf Δημοσ. 24 Νοεμβρίου 2009 Δημοσ. 24 Νοεμβρίου 2009 Μάλλον όχι (κάνει λιγότερα), γιατί ο πρόβλημα που διατυπώθηκε στο πρώτο post είναι λίγο διαφορετικό από το ^ αποπάνω ^. Αυτό που δεν καταλαβαίνω ^ στην αποπάνω ^ διατύπωση έιναι η κλήση exec, που αναφέρεται; Υ.Γ.: Πάντως μπορείς να βασιστείς στον κώδικα που σου έδωσα και να τον επεκτείνεις.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.