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

Δημιουργία πολλών διεργασιών


AfterForever

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

Καλημέρα.

Θέλω να δημιουργήσω 4 διεργασίες σε ένα πρόγραμμα για παράδειγμα.

Προφανώς να κάνω το εξής :

for(i=0;i<4;i++) fork();

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

Τι μπορώ να κάνω; Κ επίσης μετά πως μπορώ να τις ξεχωρίσω;

Ευχαριστώ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 30
  • Δημ.
  • Τελ. απάντηση

RETURN VALUES

Upon successful completion' date=' fork() returns a value of 0 to the child

process and returns the process ID of the child process to the parent

process. Otherwise, a value of -1 is returned to the parent process, no

child process is created, and the global variable errno is set to indi-

cate the error.

[/quote']

 

Άρα

>
for ...
 if ((pid[ί]=fork()) == 0)
   break;

 

Και τις ξεχωρίζεις με το pid[ί] από τον parent. Στους clients ο πίνακας pid[ί] δεν θα είναι έγκυρος.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστώ κατ' αρχάς για την απάντηση :)

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

Πως όταν έχουμε μόνο γονέα και παιδί, που λέμε:

>
pid=fork();
if(pid==0) // παιδί
else          // γονέας

 

Με μεγαλύτερο αριθμό διεργασιών (δηλαδή ένα γονέα και 3 παιδιά για παράδειγμα), πως θα ξεχωρίσουμε τα παιδιά ώστε καθένα από αυτά να κάνει τη δική του δουλειά; Δηλαδή τι συνθήκες πρέπει να βάλουμε στα if ; (Δεδομένου κιόλας ότι ο πίνακας που φτιάξαμε πριν δε φαίνεται από τα παιδιά).

Ευχαριστώ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Με μεγαλύτερο αριθμό διεργασιών (δηλαδή ένα γονέα και 3 παιδιά για παράδειγμα), πως θα ξεχωρίσουμε τα παιδιά ώστε καθένα από αυτά να κάνει τη δική του δουλειά; Δηλαδή τι συνθήκες πρέπει να βάλουμε στα if ; (Δεδομένου κιόλας ότι ο πίνακας που φτιάξαμε πριν δε φαίνεται από τα παιδιά).

Ευχαριστώ

 

Στο bold έχεις λάθος. Κάθε παιδί κληρονομεί το status του πατέρα (μεταβλητές με τις ακριβείς τιμές που είχαν τη στιγμή που έγινε κλήση της fork). Οπότε, μπορείς να έχεις έναν counter, αρχικοποιημένο σε 1, που θα αυξάνει για κάθε κλήση της fork. Εναλλακτικά, με την getpid...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σκέφτηκα ότι αν κάνω κάτι τέτοιο, θα ξέρω σε ποια διεργασία θα βρίσκομαι και θα γράψω τον ανάλογο κώδικα.

>for(i=0;i<4;i++)
    if( (pid[i]=fork())==0) )
         break;
for(i=0;i<4;i++)
    if(getpid()==pid[i]) printf("process no %d has pid %d",i,pid[i]);

 

Με αυτό δε θα έπρεπε να μου βγάζει : process no1 has pid XXXX κτλ κτλ ?

Κ όμως, δεν κάνει τίποτα. Που σημαίνει ότι δε μπαίνει στη συνθήκη. Σημειωτέον ο πίνακας έχει όντως μέσα τα pid των διεργασιών.

Τι συμβαίνει; Τι κάνω λάθος;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ε μπορεί να το έγραψα λάθος εδώ.

>
for(i=0;i<4;i++){
	if( (pid[i]=fork())==0 ) 
		break;
}
for(i=0;i<4;i++){
	if(getpid()==pid[i])
		printf("process no%d--->pid=%d\n",i,pid[i]);	
}
return 0;

 

Αυτό γίνεται κανονικά compile, απλά δεν κάνει τίποτα. Που σημαίνει ότι η συνθήκη στο if δεν ισχύει.

Βέβαια αν έχω απλά βάλω ένα getpid() χωρίς επανάληψη, μου βγάζει κανονικά 5 διεργασίες

process no0--->pid=8334 with parent 8333

process no1--->pid=8335 with parent 8333

process no2--->pid=8336 with parent 8333

process no3--->pid=8337 with parent 8333

process no4--->pid=8333 with parent 7358

 

Επαναλαμβάνω, πως γίνεται να πω;: ο μπαμπάς θα κάνει αυτό, το πρώτο παιδί αυτό, το δεύτερο αυτό κοκ ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για να μην ανοίγω νέο τόπικ :

Θέλω να φτιάξω ν διεργασίες και να κρατάω σε κοινή μνήμη τα pid τους, ώστε μετά ανάλογα με το pid (δηλαδή σε ποια διεργασία βρίσκομαι) να κάνω και την ανάλογη δουλειά.

Ξέρει κανείς να μου πει πως μπορώ να το κάνω με 2 λόγια;;

Ευχαριστώ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστώ για την απάντηση.

Τις συναρτήσεις και γενικά την κοινή μνήμη και πως λειτουργεί το ξέρω.

Πιο συγκεκριμένα ρωτάω.

πχ :

>
ppid=getpid(); //pid patera
counter=0; //global metavliti
for(i=0;i<n;i++)
   if( (pid=fork()==0){ //paidi
          down(semaphore); 
          shm[counter]=getpid(); //egraffi tou pid tis diergasias stin koini mnimi
          break;
    }
   if(getpid()==ppid) //pateras
           up(semaphore);
           counter++;

    }

Η λογική είναι η εξής. Δημιουργείται το παιδί, κατεβάζει το σημαφόρο, γράφει το pid του στην κοινή μνήμη οπότε όταν εκτελείται ο πατέραw, τον ανεβάζει, οπότε πάει η επόμενη διεργασία και ακολουθεί την ίδια διαδικασία. Είναι σωστός ο κώδικας ή ο συλλογισμός γενικότερα; Έχω έναν ενδοιασμό για το shm[counter]=getpid(); και συγκεκριμένα για το counter. Θα το βλέπουν όλες οι διεργασίες;

(Δεδομένο ότι έχω κάνει σωστά initialization, set up k attach την shared memory, όπως και το ότι οι σημαφόροι έχουν οριστεί)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δε χρειάζεσαι σημαφόρους σ' αυτήν την περίπτωση, αφού δεν έχεις ταυτόχρονες εγγραφές στην ίδια περιοχή μνήμης.

 

Στο περίπου:

>
 int pids[n+1] = {shared memory, μηδενικά};

 pids[0] = getpid(); //πατέρας
 for (i=1; i<n+1; i++)
   if(pid=fork()==0) //παιδί
     pids[i] = getpid();

 

Και στη συνέχεια ελέγχεις απλά (read only - δε χρειάζεται semaphore) το pids, αν είναι <> 0 τότε η διεργασία i έχει ξεκινήσει, αλλιώς αν θες την περιμένεις...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μετά αν θέλω να συνεχίσουν οι διεργασίες να δουλεύουν ξεχωριστά πράγματα η κάθε μία, μπορώ μετά τον κώδικα να κάνω αυτό :

if(getpid()==pid)

και να ξεχωρίσω έτσι τις διεργασίες; Θα δουλέψει;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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


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