AfterForever Δημοσ. 4 Δεκεμβρίου 2007 Μέλος Δημοσ. 4 Δεκεμβρίου 2007 Φαίνεται να δουλεύει. Ευχαριστώ πολύ
alkisg Δημοσ. 4 Δεκεμβρίου 2007 Δημοσ. 4 Δεκεμβρίου 2007 Για να ισχύει αυτό, if(getpid()==pid) και να εκτελεστεί ο αντίστοιχος κώδικας, θα πρέπει προφανώς η διεργασία να έχει δημιουργηθεί. Επομένως δεν υπάρχει πρόβλημα με τη σειρά δημιουργίας των παιδιών, πιστεύω ότι δουλεύει σε κάθε περίπτωση και χωρίς locks. Αν θες βάλε switch(getpid()) αντί των if για μικρότερο κώδικα και λιγότερες κλήσεις στην getpid(). Να 'σαι καλά.
AfterForever Δημοσ. 4 Δεκεμβρίου 2007 Μέλος Δημοσ. 4 Δεκεμβρίου 2007 Ναι με το switch θα είναι όντως πιο καθαρογραμμένο κ ευδιάκριτο. Εγώ θα "δημιουργήσω τελευταίες" (δηλαδή θα βάλω τις τελευταίες που θα δημιουργηθούν) τις διεργασίες που θα κάνουν την "προετοιμασία" του προγράμματος (που θέλω για να στέλνουν κάτι signals που χρειάζεται), οπότε οι άλλες θα' χουν δημιουργηθεί και δε θα' χω πρόβλημα. Ευχαριστώ πολύ Άλκη.
AfterForever Δημοσ. 10 Δεκεμβρίου 2007 Μέλος Δημοσ. 10 Δεκεμβρίου 2007 Καλησπέρα. Όταν έχω ένα πατέρα και Ν παιδιά, πως κάνω τον πατέρα να περιμένει να τερματίσουν και τα Ν παιδιά και μετά να τρέξει τον κώδικα του; Ευχαριστώ
alkisg Δημοσ. 10 Δεκεμβρίου 2007 Δημοσ. 10 Δεκεμβρίου 2007 http://www.hmug.org/man/2/wait.php Παράδειγμα: http://www.ecst.csuchico.edu/~beej/guide/ipc/fork.html
AfterForever Δημοσ. 10 Δεκεμβρίου 2007 Μέλος Δημοσ. 10 Δεκεμβρίου 2007 Τα έχω κοιτάξει τα manuals. Δε μπόρεσα όμως ξεκάθαρα να βγάλω άκρη. Προφανώς εμένα μου κάνει η wait4(). Το κλειδί είναι προφανώς εδώ : The pid parameter specifies the set of child processes for which to wait. If pid is -1, the call waits for any child process. If pid is 0, the call waits for any child process in the process group of the caller. If pid is greater than zero, the call waits for the process with process id pid. If pid is less than -1, the call waits for any process whose process group id equals the absolute value of pid. Τι σημαίνει "set of child processes" ? Έχω ένα πίνακα pids[] στην κοινή μνήμη για να βλέπουν όλοι τα pids και να στέλνουν τα αντίστοιχα σήματα. Έβαλα κάτι της μορφής στον πατέρα : > for(i=0;i<=n;i++) wait4(pids[i]); Αλλά ο κώδικας μετά από αυτή την εντολή του πατέρα εκτελείται και πάλι (έχω βάλει κάτι εκτυπώσεις για να ξέρω που βρίσκομαι). Είναι λογικό;
alkisg Δημοσ. 10 Δεκεμβρίου 2007 Δημοσ. 10 Δεκεμβρίου 2007 Δε χρειάζεται wait4, αρκεί η wait. Όμως πρέπει να την καλέσεις τόσες φορές όσα παιδιά έχεις (π.χ. 4 παιδιά => 4 wait). Επίσης πρέπει ο κώδικας των παιδιών να τελειώνει με exit, ώστε να τερματίσει η εκτέλεσή τους. Επιγραμματικά: κάνω 4 παιδιά, τα παιδιά κάνουν printf και μετά exit, ο πατέρας κάνει 4 wait και μετά συνεχίζει την εκτέλεσή του.
AfterForever Δημοσ. 10 Δεκεμβρίου 2007 Μέλος Δημοσ. 10 Δεκεμβρίου 2007 Κατ' αρχάς ευχαριστώ για τις απαντήσεις. Αυτό κάνω και εγώ. Μετά τις wait του πατέρα, έχω βάλει κάτι printf, οι οποίες εμφανίζονται στη μέση του προγράμματος και όχι στο τέλος που είναι το λογικό. Γιατί; Το κακό είναι ότι ο πατέρας στο τέλος αποδεσμεύει την κοινή μνήμη και διαγράφει τους σημαφόρους, οπότε δε θέλω με τίποτα να γίνει αυτό όταν εκτελείται το πρόγραμμα...
alkisg Δημοσ. 10 Δεκεμβρίου 2007 Δημοσ. 10 Δεκεμβρίου 2007 Ανέβασε όλον τον κώδικα ή τέλος πάντων όσο μεγαλύτερο κομμάτι μπορείς, κάπου έχεις λάθος. Η wait() θα έπρεπε να περιμένει να τελειώσουν τα παιδιά πριν προχωρήσει, και η exit() αν θυμάμαι καλά αδειάζει και τους buffers (fflush), οπότε δεν θα έπρεπε να εμφανίζονται print των παιδιών μετά τη wait.
AfterForever Δημοσ. 10 Δεκεμβρίου 2007 Μέλος Δημοσ. 10 Δεκεμβρίου 2007 > int ppid=getpid(); for(i=0;i<=n;i++){ if( ( (pid = fork() ) ) == 0 ){ pids[i]=getpid(); break; // ftiaxtikan ta paidia } } if(getpid()==ppid){ //pateras for(i=0;i<=n;i++) waitpid(); // mpla mpla exit(-1); } if(getpid()==pids[0]){ //to prwto paidi //mpla mpla exit(-1); } for(i=1;i<=n;i++){ if(getpid()==pids[i]){ // ta alla paidia //mpla mpla exit(-1); } }
Red_Phantom Δημοσ. 10 Δεκεμβρίου 2007 Δημοσ. 10 Δεκεμβρίου 2007 > #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #define CHILDREN 5 int main(void) { int i,pid; for(i=0;i<CHILDREN;i++) { if((pid=fork())==0) { // ChildrenCode(); printf("I am children Number: %d\n",i); break; } } if(pid == 0) exit(0); //Edw kanoun exit ta pedia for(i=0;i<CHILDREN;i++) wait(0); return 0; }
AfterForever Δημοσ. 10 Δεκεμβρίου 2007 Μέλος Δημοσ. 10 Δεκεμβρίου 2007 Ευχαριστώ πολύ για τις απαντήσεις σας. Κ εγώ σε κάτι τέτοιο κατέληξα, αν κ βέβαια τώρα θα πάω να γράψω κώδικα να δω τι παίζει. Κ αν χρειαστεί θα επανέλθω
dop Δημοσ. 11 Δεκεμβρίου 2007 Δημοσ. 11 Δεκεμβρίου 2007 Κοινό address space και διεργασίες δεν πάνε μαζί - για αυτή την περίπτωση έχεις τα threads. Οι διεργασίες υποτίθεται πως δεν μοιράζονται τίποτα. Βέβαια από την άλλη υπάρχουν τα pipes, message passing, RPC κλπ κλπ
alkisg Δημοσ. 11 Δεκεμβρίου 2007 Δημοσ. 11 Δεκεμβρίου 2007 Dop, ο λόγος που βγήκε η κοινή μνήμη είναι ειδικά για τις διεργασίες... Τα threads δεν έχουν "διαμοιραζόμενη μνήμη" (shared memory), αλλά έχουν την ίδια μνήμη, το ίδιο data segment (αυτό δεν λέγεται "κοινή"). Διάβασε λίγο στο manual της shmget, μόνο για process groups και fork μιλάει, καμία αναφορά σε threads (όχι ότι δεν γίνεται να χρησιμοποιηθεί και από threads, απλά δεν έχει νόημα, αφού έχουν το ίδιο data segment συνήθως δεν χρειάζονται και shared memory).
dop Δημοσ. 11 Δεκεμβρίου 2007 Δημοσ. 11 Δεκεμβρίου 2007 Ενδιαφέρον.. Δεν είχα υπόψην το συγκεκριμένο τρόπο επικοινωνίας - ιδιαίτερα τους semaphores για αυτή τη δουλειά. Και έχεις δίκιο για το shared memory. Από κλασική μου απροσεξία ήθελα να γράψω address space.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.