אתה נמצא כאן יסודות השפה  »  יצירת תהליכונים  »  exec ו- fork

exec,fork

exec

 exec זהה בפעולתה ל- system. ההבדל היחיד הוא ש  exec לא יוצר תהליכון חדש אלא רץ (ובעצם מחליף) את תוכנית האם שקוראת לו. ברגע שהפקודה ש  execנקראה לבצע נגמרת, התכנית כולה (כולל תוכנית האם) יוצאת.


בגלל ש exec ממשיכה מהנקודה בה תוכנית האם מפסיקה, היא יורשת את הגדרות הקלט/פלט של תוכנית האם.

#!/usr/local/bin/perl

exec "date";
/*מתנהגת כמו system אבל מסימת את תכנית האם*/

fork

fork היא הדרך הדינמית ביותר ליצירת תהליכון בן. פקודת fork יוצרת תהליכון בן שמתחיל לרוץ משורת הקוד הבאה, מיד אחרי ביצוע פקודת ה fork. כל הדרכים הקודמות עסקו ביצירת תהליכון חדש במעטפת ה  shell.
 fork יוצר תהליכון חדש שנמצא באותה נקודה בקוד שבה נמצאת תכנית האם.
הערך המוחזר של פונקצית fork הוא אפס עבור תהליכון הבן, ומספר התהליכון של הבן  (process ID)עבור האב. אם הפעולה נכשלה, מוחזר ערך  undeff. לדוגמא:

#!/usr/local/bin/perl

if (!defined($child_pid = fork())) {
/*אם פעולת ה fork נכשלה*/

    die "failed fork: $!";
} elsif ($child_pid) {
/*אם הערך שונה מאפס סימן שאנחנו בתהליך האב*/

     #Do parent stuff
} else {
/*אחרת אנחנו בתהליך הבן*/

    #Do child stuff
}

כל אחד מהתהליכים (אב, בן) יכנס לחלק אחר בקוד.

wait ו- wiatpid

כאשר רוצים שתכנית האם תמתין לסיום הביצוע של תהליך הבן, צריך דרך לגרום לתכנית האם לעצור עד שמתקבלת הודעה שתהליך הבן סיים. הפונקציה wait עוצרת את תוכנית האם ("תהליך האב") עד שבן כלשהוא מסיים. הפונקציה wiatpid ממתינה לסיום של תהליך ספציפי
דוגמא:

#!/usr/local/bin/perl

if (!defined($child_pid = fork())) {
/*אם פעולת ה fork נכשלה*/

    die "failed fork: $!";
} elsif ($child_pid==0) {
/*אם הערך הוא אפס סימן שאנחנו בתהליך הבן*/

    exec ("date");
    die "failed to exec date: $!";
/*אם הגענו לפה סימן ש exec נכשל והתכנית לא יצאה.*/

} else {
/*הערך של child_pid הוא או שונה מאפס או undeff ולכן אנחנו בתהליך האב*/

    waitpid($child_pid,0);
}








להוספת תגובה, אנא התחברו לדרכונט.