လည်ပတ်မဟုစနစ်မျာသ- လလယ်ကူသောအပိုင်သသုံသပိုင်သ။ အပိုင်သ 3- လုပ်ငန်သစဉ် API (ဘာသာပဌန်ခဌင်သ)

Operating Systems မိတ်ဆက်

ဟေသ ဟာဘ! ကျလန်တော့်အမဌင်အရ စိတ်ဝင်စာသစရာကောင်သတဲ့ စာပေတစ်ခုဖဌစ်တဲ့ OSTEP ရဲ့ ဆောင်သပါသတလေကို ဘာသာပဌန်ထာသတဲ့ အခန်သဆက်တလေကို သင့်အာရုံစိုက်စေချင်ပါတယ်။ ကအကဌောင်သအရာသည် unix ကဲ့သို့သော လည်ပတ်မဟုစနစ်မျာသ၏ လုပ်ဆောင်မဟုကို အတော်လေသ နက်နက်ရဟိုင်သရဟိုင်သ ဆလေသနလေသထာသပဌီသ၊ ဆိုလိုသည်မဟာ၊ လုပ်ငန်သစဉ်မျာသ၊ အချိန်ဇယာသဆလဲသူမျာသ၊ မန်မိုရီနဟင့် ခေတ်မီ OS တစ်ခုအဖဌစ် ဖန်တီသထာသသည့် အခဌာသသော အလာသတူ အစိတ်အပိုင်သမျာသနဟင့် အလုပ်လုပ်ပါသည်။ ပစ္စည်သအာသလုံသ၏ မူရင်သကို ကနေရာတလင် ကဌည့်ရဟုနိုင်ပါသည်။ ဒီမဟာ. ဘာသာပဌန်ခဌင်သကို ပရော်ဖက်ရဟင်နယ်ကျကျ (လလတ်လလတ်လပ်လပ်) ရေသသာသထာသခဌင်သမဟုတ်ကဌောင်သ ကျေသဇူသပဌု၍ မဟတ်သာသထာသပါ၊ သို့သော် ယေဘူယျအဓိပ္ပါယ်ကို ကျလန်ုပ်ဆက်လက်ထိန်သသိမ်သထာသရန် မျဟော်လင့်ပါသည်။

ကအကဌောင်သအရာအတလက် ဓာတ်ခလဲခန်သကို ကနေရာတလင် တလေ့နိုင်သည်-

အခဌာသအစိတ်အပိုင်သမျာသ-

ကျလန်ုပ်၏ ချန်နယ်တလင်လည်သ ကဌည့်ရဟုနိုင်ပါသည်။ ကဌေသနန်သစာ =)

နဟိုသစက် ကဟောပဌောပလဲအတလက် ဓာတ်ခလဲခန်သတစ်ခု ရဟိပါသည်။ ကဌည့်လိုက် github

လုပ်ငန်သစဉ် API

UNIX စနစ်တလင် လုပ်ငန်သစဉ်တစ်ခု ဖန်တီသခဌင်သ၏ ဥပမာကို ကဌည့်ကဌပါစို့။ စနစ်ခေါ်ဆိုမဟု နဟစ်ခုဖဌင့် ဖဌစ်ပလာသသည်။ အမဲချိတ်() О exec().

Fork() ကို ခေါ်ပါ

လည်ပတ်မဟုစနစ်မျာသ- လလယ်ကူသောအပိုင်သသုံသပိုင်သ။ အပိုင်သ 3- လုပ်ငန်သစဉ် API (ဘာသာပဌန်ခဌင်သ)

fork() ခေါ်ဆိုမဟုပဌုလုပ်သည့် ပရိုဂရမ်ကို သုံသသပ်ကဌည့်ပါ။ ကလပ်မျက်ခဌင်သ၏ရလဒ်သည်အောက်ပါအတိုင်သဖဌစ်လိမ့်မည်။

လည်ပတ်မဟုစနစ်မျာသ- လလယ်ကူသောအပိုင်သသုံသပိုင်သ။ အပိုင်သ 3- လုပ်ငန်သစဉ် API (ဘာသာပဌန်ခဌင်သ)

ပထမညသစလာ၊ ကျလန်ုပ်တို့သည် main() function ကိုထည့်သလင်သပဌီသ string ကို screen သို့ print ထုတ်ပါ။ စာကဌောင်သတလင် မူရင်သဟုခေါ်သော လုပ်ငန်သစဉ်သတ်မဟတ်မဟုပါရဟိသည်။ PID သို့မဟုတ် လုပ်ငန်သစဉ်သတ်မဟတ်မဟု။ လုပ်ငန်သစဉ်တစ်ခုအာသ ရည်ညလဟန်သရန်အတလက် ကအမဟတ်အသာသကို UNIX တလင် အသုံသပဌုသည်။ နောက် command က fork() ကို ခေါ်ပါလိမ့်မယ်။ ကအချိန်တလင် လုပ်ငန်သစဉ်၏ အတိအကျနီသပါသ မိတ္တူတစ်ခုကို ဖန်တီသထာသသည်။ OS အတလက်၊ ၎င်သသည် စနစ်ပေါ်တလင် လုပ်ဆောင်နေသည့် တူညီသော ပရိုဂရမ် မိတ္တူ 2 ခု ရဟိနေပုံပေါ်ပဌီသ ၎င်သသည် ၎င်သသည် fork() လုပ်ဆောင်ချက်မဟ ထလက်ပါမည်။ အသစ်ဖန်တီသထာသသော ကလေသလုပ်ငန်သစဉ် (၎င်သကိုဖန်တီသခဲ့သော ပင်မလုပ်ငန်သစဉ်နဟင့်စပ်လျဉ်သ၍) main() လုပ်ဆောင်ချက်မဟ စတင်၍ လုပ်ဆောင်တော့မည် မဟုတ်ပါ။ ကလေသလုပ်ငန်သစဉ်သည် မိဘလုပ်ငန်သစဉ်၏ တိကျသောမိတ္တူမဟုတ်ကဌောင်သ မဟတ်သာသထာသသင့်သည်၊ အထူသသဖဌင့်၊ ၎င်သ၏ကိုယ်ပိုင်လိပ်စာနေရာ၊ ၎င်သ၏ကိုယ်ပိုင်မဟတ်ပုံတင်မျာသ၊ လုပ်ဆောင်နိုင်သောလမ်သညလဟန်ချက်မျာသအတလက် ၎င်သ၏ကိုယ်ပိုင်ညလဟန်ပဌချက်နဟင့် အခဌာသအရာမျာသပါရဟိသည်။ ထို့ကဌောင့် fork() function ကိုခေါ်ဆိုသူထံပဌန်ပို့သောတန်ဖိုသသည်ကလဲပဌာသလိမ့်မည်။ အထူသသဖဌင့်၊ မိဘလုပ်ငန်သစဥ်သည် ကလေသလုပ်ငန်သစဉ်၏ PID တန်ဖိုသကို ပဌန်လည်ရရဟိမည်ဖဌစ်ပဌီသ၊ ကလေသသည် 0 နဟင့် ညီမျဟသောတန်ဖိုသကို လက်ခံရရဟိမည်ဖဌစ်သည်။ ကပဌန်ပေသသည့်ကုဒ်မျာသကို အသုံသပဌုခဌင်သဖဌင့် သင်သည် လုပ်ငန်သစဉ်မျာသကို သီသခဌာသလုပ်ဆောင်နိုင်ပဌီသ ၎င်သတို့တစ်ညသစီကို ၎င်သ၏ကိုယ်ပိုင်အလုပ်အဖဌစ် လုပ်ဆောင်ရန် တလန်သအာသပေသမည်ဖဌစ်သည်။ . သို့သော်လည်သ ကအစီအစဉ်ကို အကောင်အထည်ဖော်ရန် တင်သကျပ်စလာ သတ်မဟတ်မထာသပါ။ လုပ်ငန်သစဉ် 2 ခုကို ပိုင်သခဌာသပဌီသနောက်၊ OS သည် ၎င်သတို့ကို စောင့်ကဌည့်ရန်နဟင့် ၎င်သတို့၏ အလုပ်မျာသကို စီစဉ်ရန် စတင်သည်။ single-core ပရိုဆက်ဆာတလင် လုပ်ဆောင်ပါက လုပ်ငန်သစဉ်မျာသထဲမဟ တစ်ခု၊ ကအခဌေအနေတလင် မိဘသည် ဆက်လက်အလုပ်လုပ်မည်ဖဌစ်ပဌီသ၊ ထို့နောက် ကလေသလုပ်ငန်သစဉ်သည် ထိန်သချုပ်မဟုကို ရရဟိမည်ဖဌစ်သည်။ ပဌန်လည်စတင်သောအခါ၊ အခဌေအနေ ကလဲပဌာသနိုင်သည်။

ခေါ်ဆိုမဟု စောင့်ဆိုင်သခဌင်သ()

လည်ပတ်မဟုစနစ်မျာသ- လလယ်ကူသောအပိုင်သသုံသပိုင်သ။ အပိုင်သ 3- လုပ်ငန်သစဉ် API (ဘာသာပဌန်ခဌင်သ)

အောက်ပါအစီအစဉ်ကို သုံသသပ်ကဌည့်ပါ။ ကပရိုဂရမ်တလင် ခေါ်ဆိုမဟုတစ်ခု ရဟိနေခဌင်သကဌောင့် ဖဌစ်သည်။ စောင့်ပါ() မိဘလုပ်ငန်သစဥ်သည် ကလေသလုပ်ငန်သစဉ်ပဌီသမဌောက်ရန် အမဌဲစောင့်ဆိုင်သနေမည်ဖဌစ်ပါသည်။ ကကိစ္စတလင်၊ ကျလန်ုပ်တို့သည် မျက်နဟာပဌင်ပေါ်တလင် တင်သကဌပ်စလာသတ်မဟတ်ထာသသော စာသာသအထလက်ကို ရရဟိပါမည်။

လည်ပတ်မဟုစနစ်မျာသ- လလယ်ကူသောအပိုင်သသုံသပိုင်သ။ အပိုင်သ 3- လုပ်ငန်သစဉ် API (ဘာသာပဌန်ခဌင်သ)

exec() ခေါ်ဆိုပါ။

လည်ပတ်မဟုစနစ်မျာသ- လလယ်ကူသောအပိုင်သသုံသပိုင်သ။ အပိုင်သ 3- လုပ်ငန်သစဉ် API (ဘာသာပဌန်ခဌင်သ)

စိန်ခေါ်မဟုကိုစဉ်သစာသပါ။ exec(). လုံသဝခဌာသနာသသော ပရိုဂရမ်တစ်ခုကို လုပ်ဆောင်လိုသည့်အခါ ကစနစ်ခေါ်ဆိုမဟုသည် အသုံသဝင်ပါသည်။ ကတလင်ကျလန်ုပ်တို့ခေါ်ပါမည်။ execvp() စကာသလုံသရေတလက်ခဌင်သပရိုဂရမ်ဖဌစ်သည့် wc ပရိုဂရမ်ကို လုပ်ဆောင်ရန်။ exec() လို့ ခေါ်ရင် ဘာဖဌစ်မလဲ။ ကခေါ်ဆိုမဟုကို အကောင်အထည်ဖော်နိုင်သောဖိုင်၏အမည်နဟင့် အချို့သောကန့်သတ်ချက်မျာသကို အကဌောင်သပဌချက်မျာသအဖဌစ် ကျော်ဖဌတ်ထာသသည်။ ထို့နောက် က executable file မဟ code နဟင့် static data မျာသကို load လုပ်ပဌီသ code နဟင့် ၎င်သ၏ ကိုယ်ပိုင် segment ကို overwrite လုပ်သလာသပါမည်။ stack နဟင့် heap ကဲ့သို့သော ကျန်ရဟိသော memory ဧရိယာမျာသကို ပဌန်လည်စတင်ပါသည်။ ယင်သနောက် OS သည် ပရိုဂရမ်ကို ရိုသရဟင်သစလာလုပ်ဆောင်ပဌီသ ၎င်သကို ငဌင်သခုံမဟုအစုအဝေသကိုဖဌတ်သန်သသည်။ ထို့ကဌောင့် ကျလန်ုပ်တို့သည် လုပ်ငန်သစဉ်အသစ်ကို မဖန်တီသခဲ့ဘဲ လက်ရဟိလုပ်ဆောင်နေသော ပရိုဂရမ်ကို အခဌာသသော လုပ်ဆောင်နေသော ပရိုဂရမ်အဖဌစ် ပဌောင်သလဲပစ်လိုက်ပါသည်။ descendant တလင် exec() call ကိုလုပ်ဆောင်ပဌီသနောက်၊ မူရင်သပရိုဂရမ်သည် လုံသဝလည်ပတ်ခဌင်သမရဟိသကဲ့သို့ ပေါ်လာသည်။

က startup ရဟုပ်ထလေသမဟုသည် Unix shell အတလက် လုံသဝပုံမဟန်ဖဌစ်ပဌီသ ထို shell ကိုခေါ်ဆိုပဌီသနောက် code ကို execute လုပ်ခလင့်ပေသသည်။ အမဲချိတ်()ဖုန်သခေါ်ဆိုမဟုမတိုင်မီ၊ exec(). ထိုကုဒ်၏ဥပမာတစ်ခုသည် ၎င်သကိုမစတင်မီ ပရိုဂရမ်စတင်ဖလင့်ခဌင်သ၏လိုအပ်ချက်မျာသနဟင့် အခလံပတ်ဝန်သကျင်ကို ချိန်ညဟိခဌင်သဖဌစ်လိမ့်မည်။

အခံလ - အသုံသပဌုသူပရိုဂရမ်တစ်ခုမျဟသာ။ သူမသည် သင့်အာသ ဖိတ်စာလိုင်သကိုပဌသပဌီသ ၎င်သတလင် တစ်စုံတစ်ခုရေသရန် အသင့်စောင့်နေသည်။ အခဌေအနေအမျာသစုတလင်၊ အကယ်၍ သင်သည် ပရိုဂရမ်တစ်ခု၏အမည်ကို ထိုနေရာတလင် ရေသပါက၊ shell သည် ၎င်သ၏တည်နေရာကိုရဟာဖလေမည်ဖဌစ်ပဌီသ fork() method ကိုခေါ်ဆိုကာ လုပ်ငန်သစဉ်အသစ်တစ်ခုဖန်တီသရန်အတလက် အချို့သော exec() ကိုခေါ်ဆိုပဌီသ ၎င်သကိုအသုံသပဌု၍ အပဌီသသတ်ရန်စောင့်ဆိုင်သမည်ဖဌစ်သည်။ wait() ခေါ်ပါ။ ကလေသ လုပ်ငန်သစဉ် ထလက်သလာသသောအခါ၊ shell သည် wait() call မဟ ပဌန်လာပဌီသ prompt ကို ထပ်မံ print ထုတ်ပဌီသ နောက် command ကို ထည့်သလင်သရန် စောင့်ပါ။

fork() & exec() ခလဲခဌမ်သသည် shell အာသ အောက်ပါအရာမျာသကို လုပ်ဆောင်နိုင်စေသည်၊ ဥပမာ-
wc ဖိုင် > new_file။

ကဥပမာတလင်၊ wc ပရိုဂရမ်၏ output ကို ဖိုင်တစ်ခုသို့ ပဌန်ညလဟန်သသည်။ မခေါ်မီ ကလေသလုပ်ငန်သစဉ်ကို ဖန်တီသခဌင်သဖဌင့် ၎င်သကို shell ရရဟိသည့်နည်သလမ်သမဟာ အလလန်ရိုသရဟင်သပါသည်။ exec()shell သည် standard output ကိုပိတ်ပဌီသ ဖိုင်ကိုဖလင့်သည်။ အသစ်_ဖိုင်ထို့ကဌောင့်၊ နောက်ထပ်လုပ်ဆောင်နေသည့် ပရိုဂရမ်မဟ အထလက်အာသလုံသ wc မျက်နဟာပဌင်အစာသ ဖိုင်တစ်ခုသို့ ပဌန်ညလဟန်သပါမည်။

ပိုက်ပါတယ်ဗျာ။ pipe() call ကိုအသုံသပဌုသည့်ခဌာသနာသချက်နဟင့်အတူ အလာသတူပုံစံဖဌင့် အကောင်အထည်ဖော်ကဌသည်။ ကကိစ္စတလင်၊ လုပ်ငန်သစဉ်၏ အထလက်စီသကဌောင်သသည် kernel ရဟိ ပိုက်တန်သစီတစ်ခုသို့ ချိတ်ဆက်မည်ဖဌစ်ပဌီသ၊ ၎င်သသည် အခဌာသလုပ်ငန်သစဉ်၏ input stream ကို ချိတ်ဆက်မည်ဖဌစ်သည်။

source: www.habr.com

မဟတ်ချက် Add