Διεργασίες

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, ίδιες επιφυλάξεις για το -1

  • POSIX - πηγή των PRIO_PROCESS, PRIO_PGRP και PRIO_USER· καμία από αυτές δεν είναι ενσωματωμένη

  • getpgrp - το ID ομάδας διεργασιών που θα περνούσατε ως WHO υπό PRIO_PGRP

  • fork - το παιδί κληρονομεί την τιμή nice του γονέα· διαβάστε την πίσω με getpriority μετά το fork αν χρειάζεστε επιβεβαίωση

  • $! - το μοναδικό κανάλι για διάκριση μιας αληθινής προτεραιότητας -1 από αποτυχημένη κλήση