תהליכים

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, אותן הסתייגויות לגבי -1

  • POSIX - מקור PRIO_PROCESS, PRIO_PGRP ו־PRIO_USER; אף אחד מהם אינו built-in

  • getpgrp - מזהה קבוצת־תהליכים שהייתם מעבירים כ־WHO תחת PRIO_PGRP

  • fork - הילד יורש את ערך ה־nice של ההורה; קראו אותו בחזרה עם getpriority לאחר ה־fork אם אתם צריכים לוודא

  • $! - הערוץ היחיד להבחנה בין עדיפות -1 אמיתית לבין קריאה שנכשלה