giampoul Δημοσ. 24 Νοεμβρίου 2011 Δημοσ. 24 Νοεμβρίου 2011 Γειά, προσπαθώ να δημιουργήσω ενάν συγκεκριμένο αριθμό διεργασιών στο πρόγραμμα μου, δλδ έχω μια μεταβλητή int ar_dierg. προσπάθησα έτσι: > for(i=0;i<ar_dierg;i++){ pid=fork()} αλλά δημιουργούνται πολλές παραπάνω διεργασίες από όσες θέλω. Καμία ιδέα ;;
narbi Δημοσ. 24 Νοεμβρίου 2011 Δημοσ. 24 Νοεμβρίου 2011 από τα λίγα δεδομένα που μας δίνεις για το πρόβλημα σου αυτό που μπορω να υποθέσω είναι ότι κάνεις κάποιο λάθος μετά στις if για τη διάκριση πατέρα-παιδιού.
fonsde Δημοσ. 24 Νοεμβρίου 2011 Δημοσ. 24 Νοεμβρίου 2011 υπολογιζεις μηπως και την parent ? συμφωνω με τον προλαλησαντα
Erevis Δημοσ. 25 Νοεμβρίου 2011 Δημοσ. 25 Νοεμβρίου 2011 Το πρόβλημα στον κώδικα σου είναι το εξής, όταν δημιουργείται ένα παιδί, εκτελεί κι αυτό το loop για όσες επαναλήψεις έχουνε μείνει. Π.χ αν το ar_dierg είναι 10, η 1η διεργασία που θα δημιουργηθεί θα φτίαξει άλλες 9, η 2η θα φτιάξει άλλες 8 κ.ο.κ Επίσης αυτές οι 9 και 8 κτλ διεργασίες θα δημιουργήσουν κι αυτές δικές τους. Οπότε πρέπει να βρεις ένα τρόπο να καλείται η fork μόνο για την διεργασία root.
moukoublen Δημοσ. 25 Νοεμβρίου 2011 Δημοσ. 25 Νοεμβρίου 2011 Όπως τα λέει ο Erevis είναι τα πράγματα. Με την εντολή getpid() γενικά παίρνεις το process id κάθε διεργασίας... Άρα... αν το καλέσεις πριν δημιουργήσεις άλλη διεργασία και βάλεις το αποτέλεσμα του σε μια μεταβλητή, μετά θα μπορείς να έχεις έλεγχο ποια διεργασία είναι η root και ποια όχι.
giampoul Δημοσ. 25 Νοεμβρίου 2011 Μέλος Δημοσ. 25 Νοεμβρίου 2011 Μπορεί κάποιος να γράψει ένα παράδειγμα ;; Δηλάδη αν πχ ήθελα να φτιάξω 10 διεργασίες πως θα το έκανα ;; Δεν πρέπει να βάλω την fork() σε μια δομή επανάληψης ;;
bnvdarklord Δημοσ. 25 Νοεμβρίου 2011 Δημοσ. 25 Νοεμβρίου 2011 Κάτι τέτοιο φαντάζομαι. Κάνει break από το for στην περίπτωση που δεν ειναι η root διεργασία. > int r = getpid(); int ar_dierg = 10; int i, pid; for(i=0;i<ar_dierg;i++) { pid=fork(); if(getpid() != r) // break if not root proc break; }
narbi Δημοσ. 25 Νοεμβρίου 2011 Δημοσ. 25 Νοεμβρίου 2011 Όπως λεει ο από πάνω με break στη for θα το λύσεις το θέμα αλλά όχι στην if που δίνει. Στην if που ελέγχεις αν είναι το pid==0.
bnvdarklord Δημοσ. 25 Νοεμβρίου 2011 Δημοσ. 25 Νοεμβρίου 2011 Μα με την r = getpid() που έβαλα πριν το forum δεν θα πάρει το pid της root; Οπότε θα κάνει break αν δεν ειναι η root στο for.
narbi Δημοσ. 26 Νοεμβρίου 2011 Δημοσ. 26 Νοεμβρίου 2011 Μα με την r = getpid() που έβαλα πριν το forum δεν θα πάρει το pid της root; Οπότε θα κάνει break αν δεν ειναι η root στο for. Στη θυγατρική διεργασία θες να μπαίνει η break.
bnvdarklord Δημοσ. 26 Νοεμβρίου 2011 Δημοσ. 26 Νοεμβρίου 2011 E ναι άρα με το if(getpid() != r) αν ειναι θυγρατρική θα κάνει break. Καθώς το r ειναι το pid της root.
narbi Δημοσ. 26 Νοεμβρίου 2011 Δημοσ. 26 Νοεμβρίου 2011 η root όπως τη λες είναι η πατρική διεργασία. Άλλο id έχει η πατρική και άλλο η θυγατρική. Το ίδιο λέμε με τον κώδικα. Απλά με τον τρόπο που το δίνεις εσυ συμπεριλαμβάνεις κ την περίπτωση αποτυχίας σε μια εντολή και άλλο θες να κάνει στην αποτυχία και άλλο όταν εκτελείται η θυγατρική.
giampoul Δημοσ. 29 Νοεμβρίου 2011 Μέλος Δημοσ. 29 Νοεμβρίου 2011 Ευχαριστώ όλους σας. Το πρόβλημα λύθηκε!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα