Διεργασίες

getpgrp#

Επιστρέφει το POSIX ID ομάδας διεργασιών στο οποίο ανήκει μια διεργασία.

Κάθε διεργασία Unix είναι μέλος ακριβώς μίας ομάδας διεργασιών, η οποία με τη σειρά της ανήκει σε μια συνεδρία. Οι ομάδες διεργασιών είναι ο τρόπος με τον οποίο ο πυρήνας απευθύνεται σε σχετιζόμενες διεργασίες ως μονάδα - πιο εμφανώς, είναι η μονάδα που λαμβάνει ένα σήμα από το ελέγχον τερματικό (SIGINT σε Ctrl-C, SIGTSTP σε Ctrl-Z). Η getpgrp ρωτάει τον πυρήνα για το ID ομάδας μιας δεδομένης διεργασίας· χωρίς όρισμα ή με PID ίσο με 0 απαντάει για την τρέχουσα διεργασία.

Σύνοψη#

getpgrp
getpgrp PID
getpgrp 0

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

Έναν μη αρνητικό ακέραιο - το ID ομάδας διεργασιών σε βαθμωτό περιβάλλον. Τα ID ομάδας διεργασιών μοιράζονται τον χώρο αρίθμησης PID, και το PID του αρχηγού ομάδας ισούται με το ID ομάδας, οπότε η τιμή που επιστρέφει η getpgrp 0 είναι το PID του αρχηγού ομάδας της τρέχουσας διεργασίας.

Σε σύστημα που δεν υλοποιεί καθόλου την getpgrp(2), η κλήση εγείρει μοιραία εξαίρεση. Αυτό είναι εξαιρετικά σπάνιο σε σύγχρονα Unix· τα Linux, BSD, macOS, και Solaris την υποστηρίζουν όλα.

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

Καμία. Η getpgrp διαβάζει κατάσταση πυρήνα για την κατονομασμένη διεργασία και θέτει την $! μόνο σε αποτυχία (που, σε σύστημα POSIX, σημαίνει «no such process» για μη μηδενικό PID που δεν υπάρχει).

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

Λάβετε τη δική της ομάδα της τρέχουσας διεργασίας:

my $pgid = getpgrp;
print "my group is $pgid\n";

PID ίσο με 0 σημαίνει «εγώ ο ίδιος» και είναι η φορητή μορφή - ορισμένα πολύ παλιά συστήματα δεν δέχονται καμία άλλη τιμή:

my $pgid = getpgrp 0;                 # same as getpgrp with no args

Ανίχνευση του αν η τρέχουσα διεργασία είναι ο δικός της αρχηγός ομάδας - ο συνηθισμένος έλεγχος που τρέχει ένας δαίμονας πριν καλέσει setpgrp ή POSIX::setsid για να αποσυνδεθεί από το ελέγχον τερματικό του:

if (getpgrp(0) == $$) {
    print "already a group leader\n";
}
else {
    print "group leader is ", getpgrp(0), "\n";
}

Αναζητήστε την ομάδα μιας άλλης διεργασίας, π.χ. ενός παιδιού που μόλις επέστρεψε η fork:

my $pid = fork // die "fork: $!";
if ($pid == 0) {
    # child
    exec @cmd;
}
print "child $pid is in group ", getpgrp($pid), "\n";

Στείλτε σήμα σε κάθε μέλος μιας ομάδας διεργασιών. Η kill με αρνητικό PID στοχεύει την ομάδα, και η getpgrp είναι ο τρόπος με τον οποίο ανακαλύπτετε το ID ομάδας προς αρνητικοποίηση:

my $grp = getpgrp($child);
kill 'TERM', -$grp;                   # SIGTERM to the whole group

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

  • Παραλειπόμενο όρισμα ισούται με PID ίσο με 0: τόσο η getpgrp όσο και η getpgrp 0 αναφέρουν την ομάδα της τρέχουσας διεργασίας. Προτιμήστε τη ρητή μορφή 0 όταν έχει σημασία η φορητότητα σε ιστορικά συστήματα.

  • Ανύπαρκτο PID: επιστρέφει undef και θέτει την $! σε "No such process" (ESRCH). Ελέγξτε την $!, όχι την αληθότητα της τιμής επιστροφής - ένα νόμιμο ID ομάδας ίσο με 0 είναι ψευδές στην Perl αλλά δεν είναι κατάσταση σφάλματος (είναι, σε Linux, η ομάδα idle/swapper).

  • Μη επιτρεπτές αναζητήσεις: σε συστήματα που περιορίζουν τις αναζητήσεις μεταξύ συνεδριών, η ερώτηση ενός PID σε διαφορετική συνεδρία μπορεί να αποτύχει με την $! τεθειμένη σε "Operation not permitted" (EPERM). Αυτό είναι ασυνήθιστο σε Linux, όπου οποιαδήποτε διεργασία μπορεί να ρωτήσει την ομάδα οποιουδήποτε PID.

  • getpgrp έναντι getpgrp PID: η BSD-στυλ μορφή ενός ορίσματος δεν ήταν ιστορικά φορητή σε όλα τα Unix· το POSIX τυποποίησε και τις δύο. Στις πλατφόρμες όπου τρέχει η pperl (Linux, όλοι οι στόχοι cranelift), και οι δύο μορφές λειτουργούν.

  • Προσημασμένος έναντι μη προσημασμένου: ο τύπος PID του πυρήνα είναι προσημασμένος, οπότε η επιστρεφόμενη τιμή χωράει άνετα σε ακέραιο της Perl. Επιστροφή -1 δεν χρησιμοποιείται για επιτυχία σε καμία πλατφόρμα-στόχο της pperl· αντιμετωπίστε το -1 ως φύλακα σφάλματος μόνο αν μεταφέρετε κώδικα από C codebase που το έλεγχε έτσι.

  • Δεν είναι shell-ψευδώνυμο για έλεγχο εργασιών: οι σημειογραφίες jobs και % του κελύφους λειτουργούν πάνω σε πίνακες εργασιών που κρατάει το κέλυφος, όχι απευθείας πάνω σε ομάδες διεργασιών του πυρήνα. Η getpgrp σας λέει την αλήθεια του πυρήνα, που μπορεί να αποκλίνει από την ιδέα ενός υποκελύφους για το δέντρο εργασιών.

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

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

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

  • setpgrp - τοποθετήστε μια διεργασία σε νέα ή υπάρχουσα ομάδα· το εγγραφικό αντίστοιχο της getpgrp

  • getppid - ID γονικής διεργασίας· συχνά χρειάζεται μαζί με το ID ομάδας όταν διασχίζετε σχέσεις διεργασιών

  • getpriority - διαβάστε την προτεραιότητα χρονοπρογραμματισμού, που δέχεται επίσης επιλογέα ομάδας διεργασιών (PRIO_PGRP)

  • fork - το παιδί κληρονομεί την ομάδα διεργασιών του γονέα του, οπότε η getpgrp σε ένα φρέσκο παιδί αναφέρει την ομάδα του γονέα μέχρι μια κλήση setpgrp να την αλλάξει

  • kill - το kill SIGNAL, -$pgid στέλνει σήμα σε κάθε μέλος της ομάδας· η getpgrp είναι ο τρόπος με τον οποίο βρίσκετε το $pgid

  • $$ - τρέχον PID· ίσο με getpgrp(0) όταν η διεργασία είναι ο δικός της αρχηγός ομάδας