getpriority#
מחזיר את ערך ה־nice הנוכחי של תזמון עבור תהליך, קבוצת תהליכים או משתמש.
getpriority הוא עטיפה דקה סביב קריאת המערכת getpriority(2). ערכי nice נעים מ־-20 (המועדף ביותר לתהליך) ועד 19 (הפחות מועדף); תהליך שזה עתה הופעל יורש את ערך ההורה שלו, בדרך כלל 0. רק super-user יכול להוריד ערך nice; כל משתמש רשאי להעלות את הערך שלו עצמו.
תקציר#
getpriority WHICH, WHO
WHICH בוחר את משמעות WHO:
PRIO_PROCESS-WHOהוא PID של תהליך (0משמעו התהליך הנוכחי).PRIO_PGRP-WHOהוא מזהה קבוצת־תהליכים (0משמעו הקבוצה הנוכחית).PRIO_USER-WHOהוא UID מספרי (0משמעו ה־real UID של התהליך הקורא).
שלושת הקבועים מגיעים מ־POSIX; הם אינם built-ins ואינם מיוצאים כברירת מחדל.
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;
קריאת תקרת העדיפות המשויכת ל־UID. הערך המוחזר הוא ערך ה־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 נוכחי, או real 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- צד הכתיבה של אותו זוג syscalls; אותם קבועיWHICH, אותן הסתייגויות לגבי-1POSIX- מקורPRIO_PROCESS,PRIO_PGRPו־PRIO_USER; אף אחד מהם אינו built-ingetpgrp- מזהה קבוצת־תהליכים שהייתם מעבירים כ־WHOתחתPRIO_PGRPfork- הילד יורש את ערך ה־nice של ההורה; קראו אותו בחזרה עםgetpriorityלאחר ה־fork אם אתם צריכים לוודא$!- הערוץ היחיד להבחנה בין עדיפות-1אמיתית לבין קריאה שנכשלה