Η συνάρτηση Perl Fork

E Synartese Perl Fork



Η fork() είναι μια ενσωματωμένη συνάρτηση της Perl που χρησιμοποιείται για τη δημιουργία μιας θυγατρικής διεργασίας οποιασδήποτε εκτελούμενης διεργασίας και λειτουργεί μόνο στα λειτουργικά συστήματα Linux. Δημιουργεί ένα ξεχωριστό αντίγραφο της διαδικασίας εκτέλεσης και εκτελεί και τις δύο διεργασίες παράλληλα. Έτσι, εάν η μεταβλητή της γονικής διαδικασίας ενημερωθεί, δεν θα έχει καμία επίδραση στην ίδια μεταβλητή της θυγατρικής διαδικασίας ή το αντίστροφο. Οι χρήσεις της συνάρτησης fork() στο Perl παρουσιάζονται σε αυτό το σεμινάριο.

Σύνταξη:

Η σύνταξη της συνάρτησης fork() δίνεται παρακάτω. Επιστρέφει μια αριθμητική τιμή ή 'undef'. Εάν η συνάρτηση fork() λειτουργεί με επιτυχία, επιστρέφεται ένα συγκεκριμένο αναγνωριστικό διεργασίας ή επιστρέφεται το 0 για τη θυγατρική διεργασία. Επιστρέφει 'undef' εάν η συνάρτηση fork() δεν είναι επιτυχής.







ταυτότητα ή unef πιρούνι ( ) ;

Παράδειγμα 1: Απλή χρήση της συνάρτησης Fork().

Δημιουργήστε ένα αρχείο Perl με το ακόλουθο σενάριο που δημιουργεί μια θυγατρική διεργασία από την τρέχουσα διεργασία χρησιμοποιώντας τη συνάρτηση fork(). Το αναγνωριστικό διεργασίας εκτυπώνεται μετά την εκτέλεση της συνάρτησης fork(). Οι μεταβλητές των διεργασιών γονέα και θυγατρικής αποθηκεύονται σε διαφορετικές θέσεις μνήμης. Έτσι, εάν η τιμή της μεταβλητής αλλάξει στη γονική διαδικασία, δεν θα κάνει καμία αλλαγή για την ίδια μεταβλητή της θυγατρικής διαδικασίας ή το αντίστροφο. Σε αυτό το σενάριο, η μεταβλητή της γονικής διαδικασίας αλλάζει. Στη συνέχεια, εκτυπώνονται οι μεταβλητές τόσο των γονικών όσο και των θυγατρικών διεργασιών.



#!/usr/bin/perl

χρησιμοποιήστε αυστηρά ;
χρήση προειδοποιήσεις ;
χρησιμοποιήστε 5.34.0 ;

#Δηλώστε μια μεταβλητή
$var μου = 'Δοκιμαστικό πιρούνι' ;
#Διαχωρίστε την τρέχουσα διαδικασία
$process_id μου = πιρούνι ( ) ;

#Ελέγξτε το αναγνωριστικό της διαδικασίας
αν ( $process_id < 0 )
{
λένε 'Δεν μπορώ να διαχωρίσω τη διαδικασία.' ;
}
elif ( $process_id == 0 )
{
λένε 'Παιδική διαδικασία:' ;
#Εκτύπωση της τιμής της μεταβλητής της θυγατρικής διαδικασίας
λένε 'Η τιμή της μεταβλητής: $var' ;
}
αλλού
{
λένε 'Γονική διαδικασία: $process_id' ;
#Ενημέρωση της τιμής της μεταβλητής
$var = 'Test Fork 2' ;
#Εκτύπωση της τιμής της μεταβλητής της γονικής διαδικασίας
λένε 'Η τιμή της μεταβλητής: $var' ;
}

Παραγωγή:



Η ακόλουθη έξοδος εμφανίζεται μετά την εκτέλεση του σεναρίου. Η μεταβλητή της γονικής διαδικασίας τροποποιείται με την τιμή 'Test Fork 2', αλλά η μεταβλητή της θυγατρικής διαδικασίας παραμένει αμετάβλητη. Έτσι, η τιμή της μεταβλητής της θυγατρικής διαδικασίας είναι 'Test Fork'. Αυτή ήταν η τιμή μετά το πιρούνι:





  p1

Παράδειγμα 2: Χρήση των συναρτήσεων Fork() και Wait().

Δημιουργήστε ένα αρχείο Perl με το ακόλουθο σενάριο που δείχνει τη χρήση της συνάρτησης fork() με τη συνάρτηση wait(). Τρεις μεταβλητές δηλώνονται στην αρχή του σεναρίου. Η συνάρτηση sleep() χρησιμοποιείται μέσα στο μπλοκ της γονικής διαδικασίας για 1 δευτερόλεπτο και μέσα στη θυγατρική διαδικασία για 2 δευτερόλεπτα. Το άθροισμα των δύο μεταβλητών υπολογίζεται και αποθηκεύεται σε μια άλλη μεταβλητή μέσα στο μπλοκ της γονικής διαδικασίας. Οι τιμές των δύο μεταβλητών πολλαπλασιάζονται και αποθηκεύονται σε μια άλλη μεταβλητή μέσα στη θυγατρική διεργασία. Η συνάρτηση wait() χρησιμοποιείται στο τέλος του σεναρίου για να περιμένει να ολοκληρωθεί η εργασία μιας διεργασίας πριν ξεκινήσει η εργασία μιας άλλης διεργασίας. Εάν η συνάρτηση fork() χρησιμοποιηθεί πολλές φορές στο σενάριο και πολλές διεργασίες εκτελούνται ταυτόχρονα, μπορεί να προκύψει μια κατάσταση αδιεξόδου. Το πρόβλημα μπορεί να λυθεί χρησιμοποιώντας τη συνάρτηση wait().



#!/usr/bin/perl

χρησιμοποιήστε αυστηρά ;
χρήση προειδοποιήσεις ;
χρησιμοποιήστε 5.34.0 ;

#Αρχικοποιήστε τις μεταβλητές
1 $ μου = 10 ;
2 $ μου = 25 ;
το $αποτέλεσμά μου = 0 ;

#Διαχωρίστε την τρέχουσα διαδικασία
$process_id μου = πιρούνι ( ) ;

#Ελέγξτε το αναγνωριστικό της διαδικασίας
αν ( $process_id == 0 )
{
#Υπολογίστε τον πολλαπλασιασμό των αριθμών
λένε 'Παιδική διαδικασία: $$' ;
$result = $n1 * $n2 ;
λένε «Περίμενε 2 δευτερόλεπτα... \n ' ;
ύπνος 2 ;
λένε 'Ο πολλαπλασιασμός των $n1 και $n2 είναι $result.' ;
}
elif ( $process_id > 0 )
{
#Υπολογίστε το άθροισμα των αριθμών
λένε 'Γονική διαδικασία: $$' ;
$result = $n1 + $n2 ;
λένε «Περίμενε 1 δευτερόλεπτο... \n ' ;
ύπνος 1 ;
λένε 'Το άθροισμα των $n1 και $n2 είναι $result.' ;
}
αλλού
{
λένε 'Δεν μπορώ να διαχωρίσω τη διαδικασία.' ;
}

#Περιμένετε να ολοκληρώσετε την εργασία διαδικασίας
Περίμενε ( ) ;

Παραγωγή:

Η ακόλουθη έξοδος εμφανίζεται μετά την εκτέλεση του σεναρίου. Σύμφωνα με την έξοδο, η θυγατρική διαδικασία δημιουργείται με επιτυχία, εκτυπώνεται το αναγνωριστικό διεργασίας της γονικής διαδικασίας και η δέσμη ενεργειών τίθεται σε παύση για 1 δευτερόλεπτο για να ολοκληρωθεί η εργασία. Στη συνέχεια, εκτυπώνεται το αναγνωριστικό διεργασίας της θυγατρικής διαδικασίας και το σενάριο τίθεται σε παύση για 2 δευτερόλεπτα για να ολοκληρωθεί η εργασία. Η έξοδος τόσο των γονικών όσο και των θυγατρικών διεργασιών εκτυπώνεται αργότερα:

  p2

συμπέρασμα

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