Διεργασίες

getppid#

Επιστρέφει το ID διεργασίας του γονέα της τρέχουσας διεργασίας.

Η getppid είναι ένας λεπτός περιτυλιγμός πάνω από την POSIX κλήση συστήματος getppid(2). Δεν παίρνει ορίσματα και επιστρέφει έναν ακέραιο - το PID οποιασδήποτε διεργασίας έκανε forkexec προς) στο εκτελούμενο πρόγραμμα. Σε συνδυασμό με την $$ (το PID της ίδιας της τρέχουσας διεργασίας), είναι ο τυπικός τρόπος για ένα παιδί να αναγνωρίσει τη διεργασία που το δημιούργησε.

Σύνοψη#

my $parent = getppid;

Τι επιστρέφεται#

Ένας θετικός ακέραιος - το PID της γονικής διεργασίας. Σε Linux αυτό είναι 1 (init / systemd) μόλις ο αρχικός γονέας έχει εξέλθει και το παιδί έχει επανατεθεί σε νέο γονέα· δεν υπάρχει ειδική τιμή επιστροφής για «ορφανό», η αλλαγή γονέα είναι διαφανής. Δεν επιστρέφει ποτέ undef ή 0 σε υποστηριζόμενη πλατφόρμα· η υποκείμενη κλήση συστήματος προδιαγράφεται να πετυχαίνει πάντα.

Καθολική κατάσταση που επηρεάζει#

Καμία. Η getppid διαβάζει τον πίνακα διεργασιών του πυρήνα για την τρέχουσα διεργασία· δεν αγγίζει καμία ειδική μεταβλητή της Perl. Σημειώστε ότι η $$ κρατάει το PID αυτής της διεργασίας, όχι του γονέα - ανακτήστε τον γονέα με την getppid ρητά.

Παραδείγματα#

Αναγνωρίστε τον γονέα που εκκίνησε αυτό το σενάριο:

printf "my pid is %d, my parent is %d\n", $$, getppid;

Ανίχνευση ορφάνεψης - συνηθισμένο ιδίωμα για δαίμονες που θέλουν να εξέλθουν όταν η ελέγχουσα διεργασία τους φύγει:

while (1) {
    last if getppid == 1;       # parent died, we've been reparented to init
    do_work();
    sleep 1;
}

Διεργασία-παιδί αναφέρει πίσω στον γονέα της μετά από fork:

my $pid = fork // die "fork failed: $!";
if ($pid == 0) {
    warn "child $$ spawned by $>, parent is " . getppid . "\n";
    exit 0;
}
waitpid $pid, 0;

Συγκρίνετε πριν και μετά τη fork για να επιβεβαιώσετε τη σχέση:

my $before = $$;
my $pid = fork // die $!;
if ($pid == 0) {
    die "parent mismatch" unless getppid == $before;
    exit;
}
waitpid $pid, 0;

Οριακές περιπτώσεις#

  • Κανένα όρισμα, καμία ανάγκη παρενθέσεων: η getppid είναι μηδενικής πληθικότητας ενσωματωμένη. Γράψτε getppid ή getppid()· και τα δύο αναλύονται πανομοιότυπα. Μην προσπαθήσετε να περάσετε όρισμα PID - σε αντίθεση με την getpgrp, δεν υπάρχει μορφή «γονέας άλλης διεργασίας».

  • Η επαναγονεοποίηση ορφανών είναι αόρατη: αν ο αρχικός γονέας εξέλθει, ο πυρήνας θέτει νέο γονέα στη διεργασία (την init/systemd σε Linux, ή τον πλησιέστερο πρόγονο με PR_SET_CHILD_SUBREAPER ενεργοποιημένο). Η getppid αρχίζει σιωπηλά να επιστρέφει το PID του νέου γονέα. Κώδικας που προσωρινά αποθηκεύει την τιμή επιστροφής κατά την εκκίνηση και τη συγκρίνει αργότερα είναι ο τυπικός τρόπος ανίχνευσης αυτού.

  • Race στην εκκίνηση: η κλήση της getppid εξαιρετικά νωρίς, πριν ο πυρήνας ολοκληρώσει τη ρύθμιση της διεργασίας, δεν αποτελεί ανησυχία σε κώδικα χρήστη της Perl - μέχρι να τρέξει ο διερμηνέας, το γονικό PID είναι σταθερό.

  • Αναδίπλωση PID: τα PID ανακυκλώνονται. Ένα αποθηκευμένο γονικό PID μπορεί, σε βάθος μακροχρόνιας λειτουργίας, να αναφέρεται σε διαφορετική διεργασία από τον αρχικό γονέα ακόμη και χωρίς αλλαγή γονέα. Χρησιμοποιήστε getppid == 1 (ή το αντίστοιχο PID subreaper), όχι ισότητα με μια αποθηκευμένη τιμή, όταν η πρόθεση είναι «έχει πεθάνει ο γονέας μου;».

  • Threads: από την Perl 5.16 ο workaround LinuxThreads για Linux έχει αφαιρεθεί. Η getppid τώρα επιστρέφει πάντα ό,τι αναφέρει ο πυρήνας για την τρέχουσα ομάδα thread.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • $$ - το PID της ίδιας της τρέχουσας διεργασίας· συνδυάστε με getppid για να καταγράψετε και τα δύο άκρα της σχέσης γονέα/παιδιού

  • fork - δημιουργία διεργασίας-παιδιού· η getppid του παιδιού επιστρέφει το PID της διεργασίας που έκανε fork

  • waitpid - συλλέγει συγκεκριμένο παιδί με PID· η κατοπτρική λειτουργία από την πλευρά του γονέα

  • wait - συλλέγει οποιοδήποτε παιδί· ίδια λειτουργία από την πλευρά του γονέα, χωρίς προσδιορισμένο PID

  • getpgrp - ID ομάδας διεργασιών αντί για γονικό PID· συγγενής αλλά διακριτή έννοια του πυρήνα

  • kill - αποστέλλει σήμα σε PID, συμπεριλαμβανομένου ενός που λήφθηκε από getppid (π.χ. ειδοποίηση του γονέα)