getpriority#
Επιστρέφει την τρέχουσα τιμή nice χρονοπρογραμματισμού μιας διεργασίας, ομάδας διεργασιών ή χρήστη.
Η getpriority είναι λεπτό περιτύλιγμα γύρω από την κλήση συστήματος getpriority(2). Οι τιμές nice κυμαίνονται από -20 (η πιο ευνοϊκή προς τη διεργασία) έως 19 (η λιγότερο ευνοϊκή)· μια φρέσκα δημιουργημένη διεργασία κληρονομεί την τιμή του γονέα της, τυπικά 0. Μόνο ο υπερχρήστης μπορεί να χαμηλώσει μια τιμή nice· κάθε χρήστης μπορεί να αυξήσει τη δική του.
Σύνοψη#
getpriority WHICH, WHO
Το WHICH επιλέγει τι σημαίνει το WHO:
PRIO_PROCESS- τοWHOείναι ID διεργασίας (0σημαίνει την τρέχουσα διεργασία).PRIO_PGRP- τοWHOείναι ID ομάδας διεργασιών (0σημαίνει την τρέχουσα ομάδα).PRIO_USER- τοWHOείναι αριθμητικό ID χρήστη (0σημαίνει το πραγματικό UID της καλούσας διεργασίας).
Οι τρεις σταθερές προέρχονται από την POSIX· δεν είναι ενσωματωμένες και δεν εξάγονται προεπιλεγμένα.
use POSIX qw(PRIO_PROCESS PRIO_PGRP PRIO_USER);
Τι επιστρέφεται#
Η τρέχουσα τιμή nice ως ακέραιος στο εύρος -20 .. 19.
Δεν υπάρχει διακριτή επιστροφή σφάλματος: το -1 είναι απολύτως έγκυρη τιμή nice. Για να εντοπίσετε αποτυχία, καθαρίστε την $! πριν την κλήση και επιθεωρήστε την μετά:
$! = 0;
my $nice = getpriority PRIO_PROCESS, $pid;
die "getpriority: $!" if $!;
Σε πυρήνα που υλοποιεί την getpriority(2) αλλά επιστρέφει σφάλμα (τυπικά ESRCH για ανύπαρκτο στόχο ή EINVAL για κίβδηλο WHICH), η συνάρτηση επιστρέφει -1 με την $! τεθειμένη. Σε πλατφόρμα που δεν υλοποιεί καθόλου την κλήση, η getpriority εγείρει μοιραία εξαίρεση· πιάστε την με eval αν το σενάριο πρέπει να τρέχει σε τέτοιο σύστημα.
Καθολική κατάσταση που επηρεάζει#
$!- τίθεται όταν η υποκείμενη κλήσηgetpriority(2)αποτυγχάνει. Πρέπει να καθαριστεί πριν την κλήση για να ξεχωρίσει νόμιμο αποτέλεσμα-1από σφάλμα.
Παραδείγματα#
Διαβάστε τη δική σας τιμή nice για την τρέχουσα διεργασία:
use POSIX qw(PRIO_PROCESS);
my $nice = getpriority PRIO_PROCESS, 0;
print "nice = $nice\n"; # nice = 0
Ελέγξτε άλλη διεργασία μέσω PID:
use POSIX qw(PRIO_PROCESS);
my $nice = getpriority PRIO_PROCESS, $pid;
Διαβάστε την προτεραιότητα της ομάδας διεργασιών της καλούσας διεργασίας:
use POSIX qw(PRIO_PGRP);
my $nice = getpriority PRIO_PGRP, 0;
Διαβάστε το ανώτατο όριο προτεραιότητας που σχετίζεται με ID χρήστη. Η τιμή που επιστρέφεται είναι η χαμηλότερη (πιο ευνοϊκή) τιμή nice που έχει οποιαδήποτε από τις διεργασίες αυτού του χρήστη:
use POSIX qw(PRIO_USER);
my $nice = getpriority PRIO_USER, $uid;
Ασφαλής ανάγνωση που ξεχωρίζει το -1-ως-τιμή από το -1-ως-σφάλμα:
use POSIX qw(PRIO_PROCESS);
$! = 0;
my $nice = getpriority PRIO_PROCESS, $pid;
if ($!) {
warn "cannot read priority of $pid: $!";
} else {
print "pid $pid: nice=$nice\n";
}
Οριακές περιπτώσεις#
Το
-1είναι έγκυρη επιστροφή, όχι δείκτης σφάλματος. Πάντα καθαρίζετε την$!πριν την κλήση και ελέγξτε την μετά.Το
WHO == 0είναι η συντομογραφία «εαυτός» για κάθεWHICH: τρέχον PID, τρέχον PGID, ή πραγματικό UID. Το να περάσετε ρητά το δικό σας PID / PGID / UID δίνει το ίδιο αποτέλεσμα.Η
PRIO_USERμε UID που κατέχει πολλές διεργασίες επιστρέφει την αριθμητικά χαμηλότερη τιμή nice μεταξύ αυτών των διεργασιών, αντικατοπτρίζοντας τον πιο ευνοϊκό χρονοπρογραμματισμό που απολαμβάνει αυτή τη στιγμή ο χρήστης.Απών στόχος. Ένα PID, PGID ή UID χωρίς αντίστοιχη διεργασία αποδίδει
-1και θέτει την$!σεESRCH.Λάθος
WHICH. Τιμή εκτός τωνPRIO_PROCESS/PRIO_PGRP/PRIO_USERαποδίδει-1και θέτει την$!σεEINVAL.Χωρίς
getpriority(2)στο σύστημα. Η κλήση εγείρει μοιραία εξαίρεση αντί να επιστρέψει τιμή. Προστατευτείτε μεevalσε φορητό κώδικα.Χωρίς εισαγωγή
POSIX, χωρίς σταθερές. Η γραφήgetpriority 0, 0λειτουργεί κατά τύχη επειδή τοPRIO_PROCESSτυχαίνει να είναι0σε Linux, αλλά δεν είναι φορητό. Πάντα εισάγετε και χρησιμοποιείτε τις κατονομασμένες σταθερές.Η αύξηση προτεραιότητας απαιτεί root. Η ίδια η
getpriorityδεν χρειάζεται προνόμια· η αντίστοιχη κλήσηsetpriorityαποτυγχάνει μεEACCESόταν μη-root καλών προσπαθεί να μειώσει την τιμή nice.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
setpriority- η πλευρά εγγραφής του ίδιου ζεύγους κλήσεων συστήματος· ίδιες σταθερέςWHICH, ίδιες επιφυλάξεις για το-1POSIX- πηγή τωνPRIO_PROCESS,PRIO_PGRPκαιPRIO_USER· καμία από αυτές δεν είναι ενσωματωμένηgetpgrp- το ID ομάδας διεργασιών που θα περνούσατε ωςWHOυπόPRIO_PGRPfork- το παιδί κληρονομεί την τιμή nice του γονέα· διαβάστε την πίσω μεgetpriorityμετά το fork αν χρειάζεστε επιβεβαίωση$!- το μοναδικό κανάλι για διάκριση μιας αληθινής προτεραιότητας-1από αποτυχημένη κλήση