תהליכים

getppid#

מחזיר את מזהה התהליך של הורה התהליך הנוכחי.

getppid הוא עטיפה דקה מעל קריאת המערכת POSIX getppid(2). הוא לא מקבל ארגומנטים ומחזיר מספר שלם - ה־PID של התהליך ש־fork (או exec לתוכו) את התוכנית הרצה. בשילוב עם $$ (ה־PID של התהליך הנוכחי עצמו), זוהי הדרך הסטנדרטית לילד לזהות את התהליך שיצר אותו.

תקציר#

my $parent = getppid;

מה מקבלים בחזרה#

מספר שלם חיובי - ה־PID של תהליך ההורה. ב־Linux זה 1 (init / systemd) ברגע שההורה המקורי יצא והילד עבר להורות מחדש; אין ערך החזרה מיוחד ל־״יתום״, ההורות־מחדש שקופה. לעולם אינו מחזיר undef או 0 על פלטפורמה נתמכת; קריאת המערכת שמתחת מוגדרת תמיד להצליח.

מצב גלובלי שהוא נוגע בו#

אין. getppid קורא את טבלת התהליכים של הקרנל עבור התהליך הנוכחי; הוא אינו נוגע באף משתנה Perl מיוחד. שים לב ש־$$ מכיל את ה־PID של התהליך הזה, לא של ההורה - אחזר את ההורה עם getppid במפורש.

דוגמאות#

זיהוי ההורה שהפעיל סקריפט זה:

printf "my pid is %d, my parent is %d\n", $$, getppid;

איתור יתמות - ניב נפוץ לדמונים שרוצים לצאת כשתהליך השליטה שלהם נעלם:

while (1) {
    last if getppid == 1;       # parent died, we've been reparented to init
    do_work();
    sleep 1;
}

תהליך־ילד מדווח חזרה להורה שלו לאחר fork:

my $pid = fork // die "fork failed: $!";
if ($pid == 0) {
    warn "child $$ spawned by $>, parent is " . getppid . "\n";
    exit 0;
}
waitpid $pid, 0;

השוואה לפני ואחרי fork לאישור הקשר:

my $before = $$;
my $pid = fork // die $!;
if ($pid == 0) {
    die "parent mismatch" unless getppid == $before;
    exit;
}
waitpid $pid, 0;

מקרי קצה#

  • ללא ארגומנטים, ללא צורך בסוגריים: getppid היא פונקציה מובנית ניל־אדית. כתוב getppid או getppid(); שניהם מתפרסרים זהה. אל תנסה להעביר ארגומנט PID - בניגוד ל־getpgrp, אין צורה של ״הורה של תהליך אחר״.

  • ההורות־מחדש של יתום בלתי־נראית: אם ההורה המקורי יוצא, הקרנל מבצע הורות־מחדש לתהליך (ל־init/systemd ב־Linux, או לאב הקרוב ביותר עם PR_SET_CHILD_SUBREAPER קבוע). getppid בשקט מתחיל להחזיר את ה־PID של ההורה החדש. קוד שממוטמן את ערך ההחזרה בעת ההפעלה ומשווה מאוחר יותר הוא הדרך הסטנדרטית לזהות זאת.

  • Race בעת ההפעלה: קריאה ל־getppid מוקדם מאוד, לפני שהקרנל סיים להגדיר את התהליך, אינה דאגה בקוד Perl של משתמש - עד שהפרשן רץ, ה־PID של ההורה יציב.

  • עטיפת PID: PIDים ממוחזרים. PID הורה שמור יכול, לאורך זמן ריצה ארוך, להתייחס לתהליך שונה מההורה המקורי גם ללא הורות־מחדש. השתמש ב־getppid == 1 (או ב־PID של subreaper המקביל), לא בשוויון מול ערך שמור, כשהכוונה היא ״האם ההורה שלי מת?״.

  • Threads: מאז Perl 5.16 המעקף של LinuxThreads ב־Linux הוסר. getppid עכשיו תמיד מחזיר את מה שהקרנל מדווח עבור קבוצת ה־thread הנוכחית.

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • $$ - ה־PID של התהליך הנוכחי עצמו; שלב עם getppid כדי לתעד את שני קצוות יחס ההורה/ילד

  • fork - יוצר תהליך־ילד; ה־getppid של הילד מחזיר את ה־PID של התהליך המבצע fork

  • waitpid - אוסף ילד ספציפי לפי PID; הפעולה המקבילה מצד ההורה

  • wait - אוסף כל ילד; אותה פעולה בצד ההורה, PID לא־מצוין

  • getpgrp - מזהה קבוצת התהליך במקום PID ההורה; מושג קרנל קשור אך מובחן

  • kill - שולח אות ל־PID, כולל אחד שהושג מ־getppid (לדוגמה הודעה להורה)