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- τοποθετήστε μια διεργασία σε νέα ή υπάρχουσα ομάδα· το εγγραφικό αντίστοιχο τηςgetpgrpgetppid- ID γονικής διεργασίας· συχνά χρειάζεται μαζί με το ID ομάδας όταν διασχίζετε σχέσεις διεργασιώνgetpriority- διαβάστε την προτεραιότητα χρονοπρογραμματισμού, που δέχεται επίσης επιλογέα ομάδας διεργασιών (PRIO_PGRP)fork- το παιδί κληρονομεί την ομάδα διεργασιών του γονέα του, οπότε ηgetpgrpσε ένα φρέσκο παιδί αναφέρει την ομάδα του γονέα μέχρι μια κλήσηsetpgrpνα την αλλάξειkill- τοkill SIGNAL, -$pgidστέλνει σήμα σε κάθε μέλος της ομάδας· ηgetpgrpείναι ο τρόπος με τον οποίο βρίσκετε το$pgid$$- τρέχον PID· ίσο μεgetpgrp(0)όταν η διεργασία είναι ο δικός της αρχηγός ομάδας