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 של התהליך המבצע forkwaitpid- אוסף ילד ספציפי לפי PID; הפעולה המקבילה מצד ההורהwait- אוסף כל ילד; אותה פעולה בצד ההורה, PID לא־מצויןgetpgrp- מזהה קבוצת התהליך במקום PID ההורה; מושג קרנל קשור אך מובחןkill- שולח אות ל־PID, כולל אחד שהושג מ־getppid(לדוגמה הודעה להורה)