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

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


AfterForever

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

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

Για να ισχύει αυτό,

if(getpid()==pid)

και να εκτελεστεί ο αντίστοιχος κώδικας, θα πρέπει προφανώς η διεργασία να έχει δημιουργηθεί.

 

Επομένως δεν υπάρχει πρόβλημα με τη σειρά δημιουργίας των παιδιών, πιστεύω ότι δουλεύει σε κάθε περίπτωση και χωρίς locks.

 

Αν θες βάλε switch(getpid()) αντί των if για μικρότερο κώδικα και λιγότερες κλήσεις στην getpid().

 

Να 'σαι καλά.

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

Ναι με το switch θα είναι όντως πιο καθαρογραμμένο κ ευδιάκριτο.

Εγώ θα "δημιουργήσω τελευταίες" (δηλαδή θα βάλω τις τελευταίες που θα δημιουργηθούν) τις διεργασίες που θα κάνουν την "προετοιμασία" του προγράμματος (που θέλω για να στέλνουν κάτι signals που χρειάζεται), οπότε οι άλλες θα' χουν δημιουργηθεί και δε θα' χω πρόβλημα.

Ευχαριστώ πολύ Άλκη.

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

Καλησπέρα.

Όταν έχω ένα πατέρα και Ν παιδιά, πως κάνω τον πατέρα να περιμένει να τερματίσουν και τα Ν παιδιά και μετά να τρέξει τον κώδικα του;

Ευχαριστώ

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

Τα έχω κοιτάξει τα 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]); 

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

Είναι λογικό;

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

Δε χρειάζεται wait4, αρκεί η wait. Όμως πρέπει να την καλέσεις τόσες φορές όσα παιδιά έχεις (π.χ. 4 παιδιά => 4 wait).

Επίσης πρέπει ο κώδικας των παιδιών να τελειώνει με exit, ώστε να τερματίσει η εκτέλεσή τους.

 

Επιγραμματικά:

κάνω 4 παιδιά,

τα παιδιά κάνουν printf και μετά exit,

ο πατέρας κάνει 4 wait και μετά συνεχίζει την εκτέλεσή του.

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

Κατ' αρχάς ευχαριστώ για τις απαντήσεις.

Αυτό κάνω και εγώ. Μετά τις wait του πατέρα, έχω βάλει κάτι printf, οι οποίες εμφανίζονται στη μέση του προγράμματος και όχι στο τέλος που είναι το λογικό. Γιατί;

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

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

Ανέβασε όλον τον κώδικα ή τέλος πάντων όσο μεγαλύτερο κομμάτι μπορείς, κάπου έχεις λάθος. Η wait() θα έπρεπε να περιμένει να τελειώσουν τα παιδιά πριν προχωρήσει, και η exit() αν θυμάμαι καλά αδειάζει και τους buffers (fflush), οπότε δεν θα έπρεπε να εμφανίζονται print των παιδιών μετά τη wait.

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

>
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);
	}
}

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

>

#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;
}

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

Ευχαριστώ πολύ για τις απαντήσεις σας. Κ εγώ σε κάτι τέτοιο κατέληξα, αν κ βέβαια τώρα θα πάω να γράψω κώδικα να δω τι παίζει. Κ αν χρειαστεί θα επανέλθω :)

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

Κοινό address space και διεργασίες δεν πάνε μαζί - για αυτή την περίπτωση έχεις τα threads. Οι διεργασίες υποτίθεται πως δεν μοιράζονται τίποτα.

 

Βέβαια από την άλλη υπάρχουν τα pipes, message passing, RPC κλπ κλπ

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

Dop, ο λόγος που βγήκε η κοινή μνήμη είναι ειδικά για τις διεργασίες... Τα threads δεν έχουν "διαμοιραζόμενη μνήμη" (shared memory), αλλά έχουν την ίδια μνήμη, το ίδιο data segment (αυτό δεν λέγεται "κοινή").

 

Διάβασε λίγο στο manual της shmget, μόνο για process groups και fork μιλάει, καμία αναφορά σε threads (όχι ότι δεν γίνεται να χρησιμοποιηθεί και από threads, απλά δεν έχει νόημα, αφού έχουν το ίδιο data segment συνήθως δεν χρειάζονται και shared memory).

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

Ενδιαφέρον.. Δεν είχα υπόψην το συγκεκριμένο τρόπο επικοινωνίας - ιδιαίτερα τους semaphores για αυτή τη δουλειά.

 

Και έχεις δίκιο για το shared memory. Από κλασική μου απροσεξία ήθελα να γράψω address space.

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

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

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


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