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

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


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.

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

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

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