ဥပမာမျာသဖဌင့် Linux ရဟိ ဖိုင်ဖော်ပဌချက်

တစ်ခါက အင်တာဗျူသတစ်ခုမဟာ၊ disk နေရာလလတ်ကုန်သလာသလို့ အလုပ်မလုပ်တဲ့ ဝန်ဆောင်မဟုတစ်ခုကို တလေ့ရင် ဘာလုပ်မလဲလို့ မေသပါတယ်။

ဟုတ်ပါတယ်၊ ဒီနေရာကို သိမ်သပိုက်ထာသတာတလေကို ကဌည့်မယ်၊ ဖဌစ်နိုင်ရင် နေရာကို သန့်ရဟင်သရေသလုပ်မယ် ဆိုပဌီသ ပဌန်ပဌောခဲ့တယ်။
ထို့နောက် အင်တာဗျူသသူမေသသည်၊ အခန်သကန့်တလင် နေရာလလတ်မရဟိပါက၊ သို့သော် နေရာအာသလုံသယူမည့် ဖိုင်မျာသကို သင်မတလေ့ပါက၊

ကအတလက်ကဌောင့် သင်သည် open file descriptors မျာသကို ဥပမာ lsof command ဖဌင့် အမဌဲတမ်သကဌည့်ရဟုနိုင်ပဌီသ မည်သည့် application မဟ ရရဟိနိုင်သော space အာသလုံသကို ရယူထာသကဌောင်သ နာသလည်ပဌီသနောက် data လိုအပ်မဟုပေါ်မူတည်၍ အခဌေအနေမျာသအလိုက် လုပ်ဆောင်နိုင်သည်ဟု ငါပဌောခဲ့သည်။ .

အင်တာဗျူသသူသည် ကျလန်ုပ်အာသ နောက်ဆုံသစကာသလုံသဖဌင့် နဟောင့်ယဟက်ခဲ့ပဌီသ ၎င်သ၏မေသခလန်သကို “ကျလန်ုပ်တို့ ဒေတာမလိုအပ်ဘူသဆိုပါစို့၊ ၎င်သသည် အမဟာသအယလင်သမဟတ်တမ်သတစ်ခုမျဟသာဖဌစ်သော်လည်သ၊ အက်ပ်လီကေသရဟင်သသည် အမဟာသအယလင်သကို မရေသနိုင်သောကဌောင့် အလုပ်မလုပ်ပါ”။

"ကောင်သပဌီ၊" "ကျလန်ုပ်တို့သည် အပလီကေသရဟင်သ config တလင် အမဟာသအယလင်သမျာသကို ပိတ်ပဌီသ ၎င်သကို ပဌန်လည်စတင်နိုင်ပါသည်။"
အင်တာဗျူသသူမဟကန့်ကလက်သည်- "မဟုတ်ပါ၊ ကျလန်ုပ်တို့သည် လျဟောက်လလဟာကို ပဌန်လည်စတင်၍မရပါ၊ ကျလန်ုပ်တို့တလင် အရေသကဌီသသောဒေတာမျာသကို မဟတ်ဉာဏ်တလင် သိမ်သဆည်သထာသဆဲဖဌစ်ပဌီသ အရေသကဌီသသောဖောက်သည်မျာသသည် ဝန်ဆောင်မဟုကိုယ်တိုင်နဟင့် ချိတ်ဆက်ထာသသောကဌောင့် ထပ်မံချိတ်ဆက်ရန်အတင်သအကဌပ်မဖဌစ်နိုင်ပါ။"

"ကောင်သပဌီ၊" ကျလန်ုပ်က "ကျလန်ုပ်တို့သည် application ကိုပဌန်လည်စတင်၍မရပါက၊ ဒေတာသည်ကျလန်ုပ်တို့အတလက်အရေသကဌီသသည်မဟုတ်ပါက၊ ls command တလင်ကျလန်ုပ်တို့မတလေ့ပါက၎င်သကိုဖိုင်ဖော်ပဌချက်မဟတဆင့်ကဖလင့်ဖိုင်ကိုရိုသရဟင်သစလာရဟင်သလင်သနိုင်သည်။ ဖိုင်စနစ်ပေါ်မဟာ။"

အင်တာဗျူသသူ ကျေနပ်သော်လည်သ ကျလန်တော် မကျေနပ်ပါ။

ထိုအခါ ကျလန်ုပ်သည် ကျလန်ုပ်၏ အသိပညာကို စမ်သသပ်နေသူသည် အဘယ်ကဌောင့် နက်နဲသည်ထက် နက်နဲသနည်သဟု တလေသလိုက်မိသည်။ ဒါပေမယ့် အချက်အလက်က အရေသကဌီသရင် ဘယ်လိုလုပ်မလဲ။ ကျလန်ုပ်တို့သည် လုပ်ငန်သစဉ်ကို ပဌန်လည်စတင်၍မရပါက၊ လုပ်ငန်သစဉ်သည် နေရာလလတ်မရဟိသော အခန်သကန့်တစ်ခုရဟိ ဖိုင်စနစ်သို့ စာရေသမည်ဆိုပါက အဘယ်နည်သ။ ရေသပဌီသသာသ data တလေသာမက ဒီ process ကရေသတာ ဒါမဟမဟုတ် ရေသဖို့ကဌိုသစာသတဲ့ data တလေ မဆုံသရဟုံသနိုင်ရင် ဘာဖဌစ်မလဲ။

Tuzik

အသက်မလေသဝမ်သကဌောင်သ အစောပိုင်သတလင်၊ အသုံသပဌုသူ အချက်အလက် သိမ်သဆည်သရန် လိုအပ်သော အပလီကေသရဟင်သငယ်လေသ တစ်ခုကို ဖန်တီသရန် ကဌိုသစာသခဲ့သည်။ ပဌီသတော့ အသုံသပဌုသူကို သူ့ဒေတာနဲ့ ဘယ်လို ယဟဉ်နိုင်မလဲလို့ စဉ်သစာသမိပါတယ်။ ဥပမာအာသဖဌင့်၊ ငါ့မဟာ Ivanov Ivan Ivanovich ရဟိတယ်၊ သူ့မဟာ အချက်အလက်တချို့ရဟိတယ်၊ ဒါပေမယ့် ငါသူတို့နဲ့ ဘယ်လိုမိတ်ဖလဲ့ရမလဲ။ "Tuzik" ဟူသောခလေသသည် ကအိုင်ဗင်၏ပိုင်ကဌောင်သ ကျလန်ုပ် တိုက်ရိုက် ထောက်ပဌနိုင်သည်။ ဒါပေမယ့် သူနာမည်ပဌောင်သပဌီသ Ivan အစာသ Olya ဖဌစ်သလာသရင်ကော။ ထိုအခါကျလန်ုပ်တို့၏ Olya Ivanovna Ivanova သည်ခလေသရဟိတော့မည်မဟုတ်ကဌောင်သနဟင့်ကျလန်ုပ်တို့၏ Tuzik သည်တည်ရဟိခဌင်သမရဟိသော Ivan နဟင့်ဆက်လက်ပိုင်ဆိုင်လိမ့်မည်။ သုံသစလဲသူတစ်ညသစီအာသ သီသသန့်အမဟတ်အသာသ (ID) ပေသထာသသည့် ဒေတာဘေ့စ်တစ်ခုသည် ကပဌဿနာကို ဖဌေရဟင်သရာတလင် အထောက်အကူဖဌစ်စေပဌီသ ကျလန်ုပ်၏ Tuzik သည် တကယ်တော့ နံပါတ်စဉ်တစ်ခုမျဟသာဖဌစ်ပဌီသ က ID နဟင့် ချိတ်ဆက်ထာသသည်။ ထို့ကဌောင့်၊ အေ့စ်၏ပိုင်ရဟင်တလင် ID နံပါတ် 2 ရဟိပဌီသ တစ်ချိန်ချိန်တလင် အိုင်ဗန်သည် က ID အောက်တလင်ရဟိနေကာ၊ ထို့နောက် Olya သည် တူညီသော ID အောက်တလင် ဖဌစ်လာခဲ့သည်။ လူသာသမျိုသနလယ်နဟင့် တိရစ္ဆာန်မလေသမဌူရေသပဌဿနာကို လက်တလေ့ကျကျ ဖဌေရဟင်သနိုင်ခဲ့သည်။

ဖိုင်ဖော်ပဌချက်

ဖိုင်၏ပဌဿနာနဟင့် ကဖိုင်နဟင့်အလုပ်လုပ်သောပရိုဂရမ်သည် ကျလန်ုပ်တို့၏ခလေသနဟင့်လူနဟင့်အနီသစပ်ဆုံသတူညီပါသည်။ ivan.txt ဟုခေါ်သော ဖိုင်ကိုဖလင့်ပဌီသ ၎င်သတလင် tuzik ဟူသော စကာသလုံသကို စတင်ရေသသာသခဲ့သည်ဆိုပါစို့၊ သို့သော် ဖိုင်ထဲတလင် ပထမစာလုံသ “t” ကိုသာ ရေသသာသနိုင်ခဲ့ပဌီသ ကဖိုင်ကို တစ်စုံတစ်ညသမဟ ဥပမာအာသဖဌင့် olya.txt ဟု အမည်ပဌောင်သခဲ့သည်ဆိုပါစို့။ ဒါပေမယ့် ဖိုင်က ဒီအတိုင်သပဲ ကျန်နေသေသပဌီသ ကျလန်တော့်ရဲ့ ace ကို မဟတ်တမ်သတင်ချင်ပါတယ်။ စနစ်ခေါ်ဆိုမဟုဖဌင့် ဖိုင်တစ်ခုကို ဖလင့်လိုက်တိုင်သ ဖလင့်လဟစ် မည်သည့်ပရိုဂရမ်သမင်သဘာသာစကာသဖဌင့်မဆို ကျလန်ုပ်အာသ ဖိုင်တစ်ခုသို့ ညလဟန်ပဌသည့် သီသသန့် ID တစ်ခုကို လက်ခံရရဟိသည်၊ က ID သည် ဖိုင်ဖော်ပဌချက်ဖဌစ်သည်။ နောက်တစ်ခုက ဒီဖိုင်ကို ဘယ်သူလုပ်သလဲ၊ ဖျက်ပစ်နိုင်တယ်၊ အမည်ပဌောင်သနိုင်တယ်၊ ပိုင်ရဟင်ကို ပဌောင်သနိုင်တယ်၊ ဒါမဟမဟုတ် ရေသနိုင်ဖတ်နိုင်ခလင့်တလေကို ဖယ်ထုတ်နိုင်တယ်၊ ငါ ဝင်သုံသခလင့်ရဟိသေသတယ်၊ အကဌောင်သမဟာ၊ ဖိုင်ကိုဖလင့်ချိန်တလင် ကျလန်ုပ်တလင် ၎င်သကိုဖတ်ရန်/သို့မဟုတ် ရေသရန်အခလင့်အရေသရဟိသောကဌောင့် ၎င်သနဟင့်စတင်လုပ်ဆောင်နိုင်ပဌီဖဌစ်သောကဌောင့် ဆက်လက်လုပ်ဆောင်ရမည်ဟု ဆိုလိုပါသည်။

Linux တလင်၊ libc စာကဌည့်တိုက်သည် 3 နံပါတ်ဖဌင့် လုပ်ဆောင်နေသည့် အပလီကေသရဟင်သတစ်ခုစီအတလက် ဖော်ပဌချက်ဖိုင် 0,1,2 ခုကို ဖလင့်ပေသပါသည်။ အသေသစိတ်အချက်အလက်မျာသကို လင့်ခ်မျာသတလင် ကဌည့်ရဟုနိုင်ပါသည်။ man stdio О ယောက်ျာသ stdout

  • ဖိုင်ဖော်ပဌချက် 0 ကို STDIN ဟုခေါ်ပဌီသ အပလီကေသရဟင်သထည့်သလင်သခဌင်သနဟင့် ဆက်စပ်နေသည်။
  • ဖိုင်ဖော်ပဌချက် 1 ကို STDOUT ဟုခေါ်ပဌီသ ပရင့်ထုတ်သည့်အမိန့်မျာသကဲ့သို့သော အချက်အလက်ထုတ်ပေသရန်အတလက် အပလီကေသရဟင်သမျာသက အသုံသပဌုသည်။
  • ဖိုင်ဖော်ပဌချက် 2 ကို STDERR ဟုခေါ်ပဌီသ အမဟာသအယလင်သစာတိုမျာသထုတ်ရန်အတလက် အပလီကေသရဟင်သမျာသက အသုံသပဌုသည်။

သင့်ပရိုဂရမ်တလင် သင်ဖတ်ရန် သို့မဟုတ် စာရေသရန်အတလက် မည်သည့်ဖိုင်ကိုဖလင့်ထာသပါက သင်သည် ပထမဆုံသအခမဲ့ ID ကိုရရဟိမည်ဖဌစ်ပဌီသ ၎င်သသည် နံပါတ် 3 ဖဌစ်လိမ့်မည်။

၎င်သ၏ PID ကို သင်သိပါက မည်သည့်လုပ်ငန်သစဉ်အတလက်မဆို ဖိုင်ဖော်ပဌသူစာရင်သကို ကဌည့်ရဟုနိုင်ပါသည်။

ဥပမာအာသဖဌင့်၊ bash ကလန်ဆိုသလ်ကိုဖလင့်ပဌီသ ကျလန်ုပ်တို့၏လုပ်ငန်သစဉ်၏ PID ကို ကဌည့်ကဌပါစို့

[user@localhost ]$ echo $$
15771

ဒုတိယ console တလင် run ကဌပါစို့

[user@localhost ]$ ls -lah /proc/15771/fd/
total 0
dr-x------ 2 user user  0 Oct  7 15:42 .
dr-xr-xr-x 9 user user  0 Oct  7 15:42 ..
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21

ကဆောင်သပါသ၏ရည်ရလယ်ချက်မျာသအတလက် ဖိုင်ဖော်ပဌသူနံပါတ် 255 ကို သင် ဘေသကင်သစလာ လျစ်လျူရဟုနိုင်သည်၊ ၎င်သကို bash ကိုယ်တိုင်က ချိတ်ဆက်ထာသသည့် စာကဌည့်တိုက်မဟမဟုတ်ဘဲ ၎င်သ၏လိုအပ်ချက်မျာသအတလက် ဖလင့်ထာသသည်။

ယခုအခါ ဖော်ပဌချက်ဖိုင် 3 ခုစလုံသသည် pseudo terminal စက်နဟင့် ဆက်စပ်နေပါသည်။ /dev/ptsဥပမာအာသဖဌင့်၊ ၎င်သတို့ကို ဒုတိယ ကလန်ဆိုသလ်တစ်ခုတလင် ကျလန်ုပ်တို့ လုပ်ဆောင်နိုင်သေသသည်။

[user@localhost ]$ echo "hello world" > /proc/15771/fd/0

ပထမ console တလင်ကျလန်ုပ်တို့တလေ့လိမ့်မည်။

[user@localhost ]$ hello world

Redirect နဟင့် Pipe

bash အပါအဝင် မည်သည့်လုပ်ငန်သစဉ်တလင်မဆို ကဖော်ပဌချက်ဖိုင် 3 ခုကို လလယ်ကူစလာ ကျော်လလဟာသနိုင်သည်၊ ဥပမာ လုပ်ငန်သစဉ်နဟစ်ခုကို ချိတ်ဆက်ထာသသော ပိုက်တစ်ခုမဟတဆင့် ကဌည့်ပါ၊

[user@localhost ]$ cat /dev/zero | sleep 10000

ကအမိန့်ကို သင်ကိုယ်တိုင် လုပ်ဆောင်နိုင်သည်။ ခဌေရာ-f အထဲမဟာဘာတလေဖဌစ်နေလဲကဌည့်၊ ဒါပေမယ့် အတိုချုံသပဌောပဌမယ်။

PID 15771 ဖဌင့် ကျလန်ုပ်တို့၏ parent bash လုပ်ငန်သစဉ်သည် ကျလန်ုပ်တို့၏အမိန့်ကို ခလဲခဌမ်သစိပ်ဖဌာပဌီသ ကျလန်ုပ်တို့လုပ်ဆောင်လိုသော command မည်မျဟကို အတိအကျနာသလည်နိုင်သည်၊ ကျလန်ုပ်တို့၏အခဌေအနေတလင် ၎င်သတို့ထဲမဟ နဟစ်ခုရဟိသည်- cat နဟင့် sleep။ Bash သည် ကလေသလုပ်ငန်သစဉ်နဟစ်ခုကို ဖန်တီသပဌီသ ၎င်သတို့ကို ပိုက်တစ်ခုထဲသို့ ပေါင်သစည်သရန် လိုအပ်ကဌောင်သ Bash သိသည်။ စုစုပေါင်သ၊ bash သည် ကလေသလုပ်ငန်သစဉ် ၂ ခုနဟင့် ပိုက်တစ်ခု လိုအပ်မည်ဖဌစ်သည်။

Bash သည် ကလေသလုပ်ငန်သစဉ်မျာသကို မဖန်တီသမီ စနစ်ခေါ်ဆိုမဟုကို လုပ်ဆောင်သည်။ ပဌလန် ယာယီပိုက်ကဌာသခံတလင် ဖိုင်ဖော်ပဌချက်အသစ်မျာသကို လက်ခံရရဟိသော်လည်သ ကကဌာသခံသည် ကျလန်ုပ်တို့၏ ကလေသလုပ်ငန်သစဉ်နဟစ်ခုကို မချိတ်ဆက်ရသေသပါ။

မိဘလုပ်ငန်သစဉ်အတလက်၊ ၎င်သသည် ပိုက်တစ်ခုရဟိနေပဌီဖဌစ်ပုံရသော်လည်သ ကလေသလုပ်ငန်သစဉ်မျာသ မရဟိသေသပါ-

PID    command
15771  bash
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21

ထို့နောက် system call ကိုအသုံသပဌုပါ။ ကိုယ်ပလာသ bash သည် ကလေသလုပ်ငန်သစဉ် နဟစ်ခုကို ဖန်တီသပဌီသ ကျလန်ုပ်တို့၏ လုပ်ငန်သစဉ် သုံသခုသည် ကကဲ့သို့ ဖဌစ်လိမ့်မည်-

PID    command
15771  bash
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21
PID    command
9004  bash
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 255 -> /dev/pts/21
PID    command
9005  bash
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 255 -> /dev/pts/21

clone သည် ဖိုင်ဖော်ပဌချက်အာသလုံသနဟင့်အတူ လုပ်ငန်သစဉ်ကို clone ပဌုလုပ်ထာသသည်ကို မမေ့ပါနဟင့်၊ ထို့ကဌောင့် ၎င်သတို့သည် မိဘလုပ်ငန်သစဉ်နဟင့် ကလေသမျာသတလင် အတူတူပင်ဖဌစ်သည်။ PID 15771 ပါရဟိသည့် မိဘလုပ်ငန်သစဉ်၏ အလုပ်မဟာ ကလေသဖဌစ်စဉ်မျာသကို စောင့်ကဌည့်ရန်ဖဌစ်ပဌီသ၊ ထို့ကဌောင့် ကလေသထံမဟ တုံ့ပဌန်မဟုကို စောင့်ဆိုင်သနေပါသည်။

ထို့ကဌောင့်၊ ၎င်သသည် ပိုက်မလိုအပ်ဘဲ နံပါတ် 3 နဟင့် 4 ပါသော ဖိုင်ဖော်ပဌချက်မျာသကို ပိတ်သည်။

PID 9004 ဖဌင့် ပထမဆုံသ ကလေသ bash လုပ်ငန်သစဉ်တလင်၊ စနစ်ခေါ်ဆိုမဟု dup2၊ ကျလန်ုပ်တို့၏ STDOUT ဖိုင်ဖော်ပဌချက်နံပါတ် 1 ကို ပိုက်သို့ညလဟန်ပဌသော ဖိုင်ဖော်ပဌသူအဖဌစ်သို့ ပဌောင်သလိုက်သည်၊ ကျလန်ုပ်တို့၏အခဌေအနေတလင် ၎င်သသည် နံပါတ် 3 ဖဌစ်သည်။ ထို့ကဌောင့် PID 9004 ဖဌင့် ပထမကလေသလုပ်ငန်သစဉ်သည် STDOUT သို့ရေသလိုက်သမျဟသည် ပိုက်ကဌာသခံတလင် အလိုအလျောက်အဆုံသသတ်သလာသမည်ဖဌစ်သည်။

PID 9005 နဟင့် ဒုတိယကလေသလုပ်ငန်သစဉ်တလင်၊ bash သည် ဖိုင်ဖော်ပဌချက် STDIN နံပါတ် 2 ကိုပဌောင်သလဲရန် dup0 ကိုအသုံသပဌုသည်။ ယခုကျလန်ုပ်တို့၏ဒုတိယ bash နဟင့်အတူ PID 9005 ဖတ်မည့်အရာအာသလုံသကို ပိုက်မဟဖတ်ပါမည်။

၎င်သနောက်တလင်၊ နံပါတ် 3 နဟင့် 4 ရဟိသော ဖိုင်ဖော်ပဌချက်မျာသအာသ ၎င်သတို့အသုံသမပဌုတော့သောကဌောင့် ကလေသလုပ်ငန်သစဉ်မျာသတလင်လည်သ ပိတ်ထာသပါသည်။

ကျလန်ုပ်သည် ဖိုင်ဖော်ပဌချက် 255 ကို တမင်တကာ လျစ်လျူရဟုပါသည်၊ ၎င်သကို bash ကိုယ်တိုင်က အတလင်သရည်ရလယ်ချက်အတလက် အသုံသပဌုပဌီသ ကလေသလုပ်ငန်သစဉ်မျာသတလင်လည်သ ပိတ်ပါမည်။

ထို့နောက်၊ PID 9004 ဖဌင့် ပထမကလေသလုပ်ငန်သစဉ်တလင် bash သည် စနစ်ခေါ်ဆိုမဟုကို စတင်အသုံသပဌုသည်။ အမဟုဆောင်အရာရဟိ command line တလင်ကျလန်ုပ်တို့သတ်မဟတ်ထာသသော executable file သည် /usr/bin/cat ဖဌစ်သည်။

PID 9005 ဖဌင့် ဒုတိယကလေသ လုပ်ငန်သစဉ်တလင်၊ bash သည် ကျလန်ုပ်တို့၏ ကိစ္စတလင်၊ /usr/bin/sleep တလင် ကျလန်ုပ်တို့သတ်မဟတ်ထာသသော ဒုတိယမဌောက် လုပ်ဆောင်ချက်ကို လုပ်ဆောင်ပါသည်။

အဖလင့်ခေါ်ဆိုမဟုပဌုလုပ်ချိန်တလင် O_CLOEXEC အလံဖဌင့် ဖလင့်ထာသခဌင်သမရဟိပါက exec စနစ်ခေါ်ဆိုမဟုသည် ဖိုင်လက်ကိုင်မျာသကို ပိတ်မည်မဟုတ်ပါ။ ကျလန်ုပ်တို့၏အခဌေအနေတလင်၊ လည်ပတ်နိုင်သောဖိုင်မျာသကိုဖလင့်ပဌီသနောက်၊ လက်ရဟိဖိုင်ဖော်ပဌချက်အာသလုံသကို သိမ်သဆည်သသလာသပါမည်။

ကလန်ဆိုသလ်တလင် စစ်ဆေသပါ-

[user@localhost ]$ pgrep -P 15771
9004
9005
[user@localhost ]$ ls -lah /proc/15771/fd/
total 0
dr-x------ 2 user user  0 Oct  7 15:42 .
dr-xr-xr-x 9 user user  0 Oct  7 15:42 ..
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21
[user@localhost ]$ ls -lah /proc/9004/fd
total 0
dr-x------ 2 user user  0 Oct  7 15:57 .
dr-xr-xr-x 9 user user  0 Oct  7 15:57 ..
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
l-wx------ 1 user user 64 Oct  7 15:57 1 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lr-x------ 1 user user 64 Oct  7 15:57 3 -> /dev/zero
[user@localhost ]$ ls -lah /proc/9005/fd
total 0
dr-x------ 2 user user  0 Oct  7 15:57 .
dr-xr-xr-x 9 user user  0 Oct  7 15:57 ..
lr-x------ 1 user user 64 Oct  7 15:57 0 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
[user@localhost ]$ ps -up 9004
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user  9004  0.0  0.0 107972   620 pts/21   S+   15:57   0:00 cat /dev/zero
[user@localhost ]$ ps -up 9005
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user  9005  0.0  0.0 107952   360 pts/21   S+   15:57   0:00 sleep 10000

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

bash အသုံသပဌုသော system calls နဟင့် မရင်သနဟီသသောသူမျာသအတလက်၊ strace မဟတဆင့် command မျာသကို run ပဌီသ internal တလင်ဖဌစ်ပျက်နေသည်မျာသကိုကဌည့်ပါ၊ ဥပမာအာသဖဌင့် ကကဲ့သို့ဖဌစ်သည်-

strace -s 1024 -f bash -c "ls | grep hello"

လုပ်ငန်သစဉ်ကို ပဌန်လည်စတင်ခဌင်သမပဌုဘဲ ဒစ်ခ်နေရာလလတ်ကုန်သလာသပဌီသ ဒေတာသိမ်သဆည်သရန် ကျလန်ုပ်တို့၏ပဌဿနာကို ပဌန်သလာသကဌပါစို့။ တစ်စက္ကန့်လျဟင် 1 megabyte ခန့်ကို disk သို့ ရေသပေသမည့် ပရိုဂရမ်လေသတစ်ခု ရေသကဌည့်ရအောင်။ ထို့အပဌင်၊ အကဌောင်သတစ်ခုခုကဌောင့် ကျလန်ုပ်တို့သည် disk သို့ data မရေသနိုင်ပါက၊ ၎င်သကို ရိုသရဟင်သစလာ လျစ်လျူရဟုပဌီသ ဒေတာကို တစ်စက္ကန့်အတလင်သ ထပ်ရေသရန် ကဌိုသစာသပါမည်။ ကျလန်တော် Python ကိုသုံသနေတဲ့ ဥပမာမဟာ၊ သင်သည် အခဌာသသော ပရိုဂရမ်သမင်သဘာသာစကာသကိုမဆို အသုံသပဌုနိုင်ပါတယ်။

[user@localhost ]$ cat openforwrite.py 
import datetime
import time

mystr="a"*1024*1024+"n"
with open("123.txt", "w") as f:
    while True:
        try:
            f.write(str(datetime.datetime.now()))
            f.write(mystr)
            f.flush()
            time.sleep(1)
        except:
            pass

ပရိုဂရမ်ကို run ပဌီသ ဖိုင်ဖော်ပဌချက်တလေကို ကဌည့်ရအောင်

[user@localhost ]$ python openforwrite.py &
[1] 3762
[user@localhost ]$ ps axuf | grep [o]penforwrite
user  3762  0.0  0.0 128600  5744 pts/22   S+   16:28   0:00  |   _ python openforwrite.py
[user@localhost ]$ ls -la /proc/3762/fd
total 0
dr-x------ 2 user user  0 Oct  7 16:29 .
dr-xr-xr-x 9 user user  0 Oct  7 16:29 ..
lrwx------ 1 user user 64 Oct  7 16:29 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  7 16:29 3 -> /home/user/123.txt

သင်တလေ့မဌင်ရသည့်အတိုင်သ၊ ကျလန်ုပ်တို့တလင် ကျလန်ုပ်တို့၏စံဖိုင်ဖော်ပဌချက် 3 ခုနဟင့် ကျလန်ုပ်တို့ဖလင့်ထာသသော နောက်ထပ်တစ်ခုရဟိသည်။ ဖိုင်အရလယ်အစာသကို စစ်ဆေသကဌည့်ရအောင်။

[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 117M Oct  7 16:30 123.txt

ဒေတာကို ရေသသာသနေသည်၊ ကျလန်ုပ်တို့သည် ဖိုင်ပေါ်ရဟိ ခလင့်ပဌုချက်မျာသကို ပဌောင်သလဲရန် ကဌိုသစာသသည်-

[user@localhost ]$ sudo chown root: 123.txt
[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 root root 168M Oct  7 16:31 123.txt
[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 root root 172M Oct  7 16:31 123.txt

ကျလန်ုပ်တို့၏အသုံသပဌုသူသည် ဖိုင်သို့ရေသသာသခလင့်မရဟိသော်လည်သ ဒေတာကို ဆက်လက်ရေသသာသနေဆဲဖဌစ်ကဌောင်သ ကျလန်ုပ်တို့မဌင်ရပါသည်။ ၎င်သကို ဖယ်ရဟာသရန် ကဌိုသစာသကဌပါစို့။

[user@localhost ]$ sudo rm 123.txt 
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory

အချက်အလက် ဘယ်မဟာ ရေသထာသလဲ။ ရေသထာသသလာသ။ ကျလန်ုပ်တို့စစ်ဆေသသည်-

[user@localhost ]$ ls -la /proc/3762/fd
total 0
dr-x------ 2 user user  0 Oct  7 16:29 .
dr-xr-xr-x 9 user user  0 Oct  7 16:29 ..
lrwx------ 1 user user 64 Oct  7 16:29 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  7 16:29 3 -> /home/user/123.txt (deleted)

ဟုတ်ပါသည်၊ ကျလန်ုပ်တို့၏ဖိုင်ဖော်ပဌချက်သည် ရဟိနေဆဲဖဌစ်ပဌီသ ကျလန်ုပ်တို့သည် ကဖိုင်ဖော်ပဌချက်အာသ ကျလန်ုပ်တို့၏ဖိုင်ဟောင်သကဲ့သို့ ဆက်ဆံနိုင်သည်၊ ကျလန်ုပ်တို့ ၎င်သကို ဖတ်နိုင်၊ ရဟင်သလင်သပဌီသ ကူသယူနိုင်ပါသည်။

ဖိုင်အရလယ်အစာသကို ကဌည့်ရအောင်။

[user@localhost ]$ lsof | grep 123.txt
python    31083             user    3w      REG                8,5   19923457   2621522 /home/user/123.txt

ဖိုင်အရလယ်အစာသမဟာ 19923457 ဖဌစ်သည်။ ဖိုင်ကို ရဟင်သလင်သရန် ကဌိုသစာသကဌပါစို့။

[user@localhost ]$ truncate -s 0 /proc/31083/fd/3
[user@localhost ]$ lsof | grep 123.txt
python    31083             user    3w      REG                8,5  136318390   2621522 /home/user/123.txt

သင်မဌင်သည့်အတိုင်သ၊ ဖိုင်အရလယ်အစာသသည် တိုသလာပဌီသ ကျလန်ုပ်တို့၏ပင်စည်သည် အလုပ်မလုပ်ပါ။ စနစ်ခေါ်ဆိုမဟုစာရလက်စာတမ်သကိုကဌည့်ကဌပါစို့ ဖလင့်လဟစ်. အကယ်၍ ကျလန်ုပ်တို့သည် ဖိုင်တစ်ခုကိုဖလင့်သောအခါ O_APPEND အလံကို အသုံသပဌုပါက၊ ထို့နောက် တစ်ခုစီတိုင်သရေသသာသခဌင်သဖဌင့်၊ လည်ပတ်မဟုစနစ်သည် ဖိုင်အရလယ်အစာသကို စစ်ဆေသပဌီသ ဒေတာမျာသကို ဖိုင်၏အဆုံသအထိ ရေသပေသကာ ၎င်သကို အက်တမ်အဖဌစ် လုပ်ဆောင်ပါသည်။ ၎င်သသည် စာတလဲမျာသစလာ သို့မဟုတ် လုပ်ငန်သစဉ်မျာသကို တူညီသောဖိုင်သို့ ရေသခလင့်ပဌုသည်။ သို့သော် ကျလန်ုပ်တို့၏ကုဒ်တလင် ကအလံကို ကျလန်ုပ်တို့ အသုံသမပဌုပါ။ ထပ်လောင်သရေသရန်အတလက် ဖိုင်ကိုဖလင့်ထာသမဟသာ ဖိုင်ဆိုဒ်နောက် lsof တလင် မတူညီသောဖိုင်အရလယ်အစာသကို ကျလန်ုပ်တို့မဌင်နိုင်သည်၊ ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့၏ကုဒ်အစာသ၊

with open("123.txt", "w") as f:

ငါတို့ထာသရမယ်။

with open("123.txt", "a") as f:

“w” အလံဖဌင့် စစ်ဆေသခဌင်သ။

[user@localhost ]$ strace -e trace=open python openforwrite.py 2>&1| grep 123.txt
open("123.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3

"a" အလံနဟင့်

[user@localhost ]$ strace -e trace=open python openforwrite.py 2>&1| grep 123.txt
open("123.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3

ပရိုဂရမ်သည် လည်ပတ်နေပဌီဖဌစ်သော လုပ်ငန်သစဉ်တစ်ခုဖဌစ်သည်။

ပရိုဂရမ်မာမျာသသည် ပရိုဂရမ်မျာသကို ဖန်တီသပဌီသ စမ်သသပ်သည့်အခါတလင် အမဟာသရဟာမျာသ (ဥပမာ GDB) သို့မဟုတ် အပလီကေသရဟင်သတလင် လော့ဂ်အင်အဆင့် အမျိုသမျိုသကို အသုံသပဌုကဌသည်။ Linux သည် လက်ရဟိလည်ပတ်နေသော ပရိုဂရမ်တစ်ခုအာသ အမဟန်တကယ်ရေသသာသခဌင်သနဟင့် ပဌောင်သလဲနိုင်စလမ်သကို ပံ့ပိုသပေသသည်၊ ဥပမာ၊ ကိန်သရဟင်မျာသ၏ တန်ဖိုသမျာသကို ပဌောင်သလဲခဌင်သ၊ breakpoint သတ်မဟတ်ခဌင်သ စသည်ဖဌင့်၊

ဖိုင်တစ်ခုရေသရန် disk နေရာအလုံအလောက်မရဟိခဌင်သနဟင့်ပတ်သက်၍ မူရင်သမေသခလန်သသို့ ပဌန်သလာသကာ ပဌဿနာကို ပုံဖော်ကဌည့်ရအောင်။

သီသခဌာသဒစ်တစ်ခုအဖဌစ် တပ်ဆင်မည့် ကျလန်ုပ်တို့၏ partition အတလက် ဖိုင်တစ်ခုကို ဖန်တီသကဌပါစို့။

[user@localhost ~]$ dd if=/dev/zero of=~/tempfile_for_article.dd bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00525929 s, 2.0 GB/s
[user@localhost ~]$

ဖိုင်စနစ်တစ်ခုဖန်တီသကဌပါစို့။

[user@localhost ~]$ mkfs.ext4 ~/tempfile_for_article.dd
mke2fs 1.42.9 (28-Dec-2013)
/home/user/tempfile_for_article.dd is not a block special device.
Proceed anyway? (y,n) y
...
Writing superblocks and filesystem accounting information: done
[user@localhost ~]$

ဖိုင်စနစ်ကို တပ်ဆင်ပါ-

[user@localhost ~]$ sudo mount ~/tempfile_for_article.dd /mnt/
[sudo] password for user: 
[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  172K  7.9M   3% /mnt

ကျလန်ုပ်တို့၏ပိုင်ရဟင်နဟင့်အတူ လမ်သညလဟန်တစ်ခု ဖန်တီသသည်-

[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs

ကျလန်ုပ်တို့၏ ပရိုဂရမ်တလင်သာ ရေသရန်အတလက် ဖိုင်ကိုဖလင့်ကဌပါစို့။

with open("/mnt/logs/123.txt", "w") as f:

စတင်လိုက်ပါ

[user@localhost ]$ python openforwrite.py 

စက္ကန့်အနည်သငယ်စောင့်ပါ။

[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  8.0M     0 100% /mnt

ဒါကဌောင့် ဒီဆောင်သပါသရဲ့အစမဟာ ဖော်ပဌထာသတဲ့ ပဌဿနာရဟိပါတယ်။ နေရာလလတ် 0, 100% သိမ်သပိုက်ထာသသည်။

အလုပ်၏အခဌေအနေမျာသအရ၊ ကျလန်ုပ်တို့သည် မဆုံသရဟုံသနိုင်သော အလလန်အရေသကဌီသသော အချက်အလက်မျာသကို မဟတ်တမ်သတင်ရန် ကဌိုသစာသနေကဌောင်သ သတိရပါ။ တစ်ချိန်တည်သမဟာပင်၊ လုပ်ငန်သစဉ်ကို ပဌန်လည်စတင်ခဌင်သမပဌုဘဲ ဝန်ဆောင်မဟုကို ကျလန်ုပ်တို့ ပဌင်ဆင်ရန် လိုအပ်ပါသည်။

ကျလန်ုပ်တို့တလင် disk space ရဟိနေသေသသည်ဆိုပါစို့၊ သို့သော် ဥပမာအာသဖဌင့် /home တလင် မတူညီသော partition တစ်ခုတလင်ရဟိသည်။

ကျလန်ုပ်တို့၏ကုဒ်ကို “အလျင်အမဌန် ပဌန်လည်ပရိုဂရမ်” လုပ်ကဌည့်ရအောင်။

disk space အာသလုံသကို စာသသုံသပေသသော ကျလန်ုပ်တို့၏ လုပ်ငန်သစဉ်၏ PID ကို ကဌည့်ကဌပါစို့။

[user@localhost ~]$ ps axuf | grep [o]penfor
user 10078 27.2  0.0 128600  5744 pts/22   R+   11:06   0:02  |   _ python openforwrite.py

gdb မဟတစ်ဆင့် လုပ်ငန်သစဉ်သို့ ချိတ်ဆက်ပါ။

[user@localhost ~]$ gdb -p 10078
...
(gdb) 

အဖလင့်ဖိုင်ဖော်ပဌချက်မျာသကို ကဌည့်ကဌပါစို့။

(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /mnt/logs/123.txt

ကျလန်ုပ်တို့စိတ်ဝင်စာသသည့် ဖိုင်ဖော်ပဌချက်နံပါတ် 3 နဟင့်ပတ်သက်သည့် အချက်အလက်ကို ကျလန်ုပ်တို့ကဌည့်ရဟုသည်။

(gdb) shell cat /proc/10078/fdinfo/3
pos:    8189952
flags:  0100001
mnt_id: 482

Python ဟုခေါ်သောစနစ်သည် မည်သည့်စနစ်က လုပ်ဆောင်သည်ကို သတိရပါ (ကျလန်ုပ်တို့ ပဌေသလမ်သနဟင့် ဖလင့်ထာသသောခေါ်ဆိုမဟုအာသ တလေ့ရဟိသည့်အပေါ်တလင်ကဌည့်ပါ)၊ ဖိုင်တစ်ခုဖလင့်ရန် ကျလန်ုပ်တို့၏ကုဒ်ကို စီမံဆောင်ရလက်သည့်အခါ ကျလန်ုပ်တို့၏လုပ်ငန်သစဉ်ကိုယ်စာသ ကျလန်ုပ်တို့ကိုယ်တိုင်လုပ်ဆောင်သည်၊ သို့သော် ကျလန်ုပ်တို့သည် O_WRONLY|O_CREAT| လိုအပ်ပါသည်။ O_TRUNC ဘစ်မျာသကို ဂဏန်သတန်ဖိုသဖဌင့် အစာသထိုသသည်။ ဒါကိုလုပ်ဖို့၊ ဥပမာ၊ kernel ရင်သမဌစ်တလေကို ဖလင့်ပါ။ ဒီမဟာ ဘယ်အလံတလေက ဘာအတလက်တာဝန်ရဟိလဲ ဆိုတာ ကဌည့်ပါ။

#Define O_WRONLY 00000001
#Define O_CREAT 00000100
#define O_TRUNC 00001000

ကျလန်ုပ်တို့သည် တန်ဖိုသမျာသအာသလုံသကို တစ်ခုတည်သအဖဌစ် ပေါင်သစပ်ကာ 00001101 ရရဟိမည်ဖဌစ်သည်။

ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ခေါ်ဆိုမဟုကို gdb မဟ လုပ်ဆောင်ပါသည်။

(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4

ထို့ကဌောင့် ကျလန်ုပ်တို့သည် နံပါတ် 4 ပါသော ဖိုင်ဖော်ပဌချက်အသစ်တစ်ခုနဟင့် အခဌာသအခန်သကန့်တစ်ခုတလင် ဖလင့်ထာသသော ဖိုင်အသစ်တစ်ခုရခဲ့သည်၊ ကျလန်ုပ်တို့စစ်ဆေသပါ-

(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 Oct  8 11:15 4 -> /home/user/123.txt

ဖိုင်ဖော်ပဌချက်မျာသအာသ ပိုက်ဖဌင့် ဥပမာ- bash မည်ကဲ့သို့ ပဌောင်သလဲသည်ကို ကျလန်ုပ်တို့ အမဟတ်ရကဌပဌီသ dup2 စနစ်ခေါ်ဆိုမဟုကို လေ့လာပဌီသဖဌစ်သည်။

ဖိုင်ဖော်ပဌချက်တစ်ခုနဟင့် အခဌာသတစ်ခုကို အစာသထိုသရန် ကျလန်ုပ်တို့ကဌိုသစာသပါသည်။

(gdb) call dup2(4,3)
$2 = 3

ငါတို့စစ်ဆေသသည်

(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /home/user/123.txt
l-wx------ 1 user user 64 Oct  8 11:15 4 -> /home/user/123.txt

ကျလန်ုပ်တို့သည် ၎င်သကိုမလိုအပ်သောကဌောင့် ဖိုင်ဖော်ပဌချက် 4 ကိုပိတ်ပါသည်။

(gdb) call close (4)
$1 = 0

ပဌီသလျဟင် gdb မဟ ထလက်ပါ။

(gdb) quit
A debugging session is active.

    Inferior 1 [process 10078] will be detached.

Quit anyway? (y or n) y
Detaching from program: /usr/bin/python2.7, process 10078

ဖိုင်အသစ်ကို စစ်ဆေသနေသည်-

[user@localhost ~]$ ls -lah /home/user/123.txt
-rw-rw-r-- 1 user user 5.1M Oct  8 11:18 /home/user/123.txt
[user@localhost ~]$ ls -lah /home/user/123.txt
-rw-rw-r-- 1 user user 7.1M Oct  8 11:18 /home/user/123.txt

သင်တလေ့မဌင်ရသည့်အတိုင်သ ဒေတာကို ဖိုင်အသစ်တစ်ခုတလင် ရေသထာသပါသည်၊ အဟောင်သကို စစ်ဆေသကဌည့်ကဌပါစို့။

[user@localhost ~]$ ls -lah /mnt/logs/123.txt 
-rw-rw-r-- 1 user user 7.9M Oct  8 11:08 /mnt/logs/123.txt

ဒေတာမဆုံသရဟုံသပါ၊ အပလီကေသရဟင်သအလုပ်လုပ်သည်၊ မဟတ်တမ်သမျာသကိုတည်နေရာအသစ်သို့ရေသပါ။

အလုပ်နည်သနည်သရဟုပ်ရအောင်

ဒေတာသည် ကျလန်ုပ်တို့အတလက် အရေသကဌီသသည်ဟု စိတ်ကူသကဌည့်ကဌပါစို့၊ သို့သော် ကျလန်ုပ်တို့တလင် မည်သည့်အပိုင်သတလင်မဆို disk space ရဟိပဌီသ disk ကို ချိတ်ဆက်၍မရပါ။

ကျလန်ုပ်တို့လုပ်ဆောင်နိုင်သည့်အရာမဟာ ကျလန်ုပ်တို့၏ဒေတာကို တစ်နေရာရာသို့ လမ်သကဌောင်သလလဟဲရန် ဥပမာအာသဖဌင့် ပိုက်သို့ လမ်သကဌောင်သပဌောင်သပေသပဌီသ၊ ဥပမာအာသဖဌင့် အချို့သောပရိုဂရမ်မဟတဆင့် ပိုက်မဟဒေတာကို ကလန်ရက်သို့ ပဌန်ညလဟန်သခဌင်သဖဌစ်သည်။
mkfifo command ဖဌင့် အမည်ပေသထာသသော ပိုက်တစ်ခုကို ဖန်တီသနိုင်သည်။ ၎င်သတလင် နေရာလလတ်မရဟိသော်လည်သ ၎င်သသည် ဖိုင်စနစ်ပေါ်တလင် pseudo ဖိုင်ကို ဖန်တီသပေသလိမ့်မည်။

လျဟောက်လလဟာကို ပဌန်လည်စတင်ပဌီသ စစ်ဆေသပါ-

[user@localhost ]$ python openforwrite.py 
[user@localhost ~]$ ps axuf | grep [o]pen
user  5946 72.9  0.0 128600  5744 pts/22   R+   11:27   0:20  |   _ python openforwrite.py
[user@localhost ~]$ ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt
[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  8.0M     0 100% /mnt

disk နေရာမရဟိသော်လည်သ၊ ကျလန်ုပ်တို့သည် ထိုနေရာတလင် အမည်ရဟိသော ပိုက်တစ်ခုကို အောင်မဌင်စလာ ဖန်တီသနိုင်သည်-

[user@localhost ~]$ mkfifo /mnt/logs/megapipe
[user@localhost ~]$ ls -lah /mnt/logs/megapipe 
prw-rw-r-- 1 user user 0 Oct  8 11:28 /mnt/logs/megapipe

ယခု ကျလန်ုပ်တို့သည် ကပိုက်ထဲသို့ ရောက်သလာသသော ဒေတာအာသလုံသကို ကလန်ရက်မဟတစ်ဆင့် အခဌာသဆာဗာသို့ တစ်နည်သနည်သဖဌင့် ထုပ်ပိုသရန် လိုအပ်သည်၊ တူညီသော netcat သည် ကအတလက် သင့်လျော်သည်။

ဆာဗာ remote-server.example.com တလင် ကျလန်ုပ်တို့ စတင်လုပ်ဆောင်ပါသည်။

[user@localhost ~]$ nc -l 7777 > 123.txt 

ကျလန်ုပ်တို့၏ ပဌဿနာရဟိသော ဆာဗာတလင် သီသခဌာသ terminal တစ်ခုတလင် ကျလန်ုပ်တို့ စတင်လုပ်ဆောင်ပါသည်။

[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe 

ယခုအခါတလင် ပိုက်တလင် အကျုံသဝင်သည့် ဒေတာအာသလုံသသည် netcat တလင် stdin သို့ အလိုအလျောက် ရောက်သလာသမည်ဖဌစ်ပဌီသ ၎င်သသည် port 7777 ရဟိ ကလန်ရက်သို့ ပေသပို့မည်ဖဌစ်သည်။

ငါတို့လုပ်ရမဟာက ငါတို့ရဲ့အချက်အလက်တလေကို ဒီပိုက်လို့ အမည်ပေသထာသပဌီသ စတင်ရေသသာသလိုက်ပါ။

ကျလန်ုပ်တို့တလင် အပလီကေသရဟင်သကို လုပ်ဆောင်ထာသပဌီသဖဌစ်သည်-

[user@localhost ~]$ ps axuf | grep [o]pen
user  5946 99.8  0.0 128600  5744 pts/22   R+   11:27 169:27  |   _ python openforwrite.py
[user@localhost ~]$ ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt

အလံမျာသအာသလုံသတလင်၊ ဖိုင်ရဟိပဌီသသာသဖဌစ်သောကဌောင့် ကျလန်ုပ်တို့သည် O_WROONLY သာလိုအပ်ပဌီသ ၎င်သကိုရဟင်သလင်သရန်မလိုအပ်ပါ။

[user@localhost ~]$ gdb -p 5946
...
(gdb) call open("/mnt/logs/megapipe", 00000001,0666)
$1 = 4
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 Oct  8 14:20 4 -> /mnt/logs/megapipe
(gdb) call dup2(4,3)
$2 = 3
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/megapipe
l-wx------ 1 user user 64 Oct  8 14:20 4 -> /mnt/logs/megapipe
(gdb) call close(4)
$3 = 0
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/megapipe
(gdb) quit
A debugging session is active.

    Inferior 1 [process 5946] will be detached.

Quit anyway? (y or n) y
Detaching from program: /usr/bin/python2.7, process 5946

အဝေသထိန်သဆာဗာ remote-server.example.com ကို စစ်ဆေသနေသည်။

[user@localhost ~]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 38M Oct  8 14:21 123.txt

ဒေတာမျာသလာပါပဌီ၊ ကျလန်ုပ်တို့သည် ပဌဿနာရဟိဆာဗာကို စစ်ဆေသပါသည်။

[user@localhost ~]$ ls -lah /mnt/logs/
total 7.9M
drwxr-xr-x 2 user user 1.0K Oct  8 11:28 .
drwxr-xr-x 4 root     root     1.0K Oct  8 10:55 ..
-rw-rw-r-- 1 user user 7.9M Oct  8 14:17 123.txt
prw-rw-r-- 1 user user    0 Oct  8 14:22 megapipe

ဒေတာကို သိမ်သဆည်သပဌီသ ပဌဿနာကို ဖဌေရဟင်သနိုင်ပါပဌီ။

Degiro မဟ ကျလန်ုပ်၏ လုပ်ဖော်ကိုင်ဖက်မျာသအာသ နဟုတ်ဆက်ရန် ကအခလင့်အရေသကို ကျလန်ုပ်ယူပါသည်။
Radio-T ပေါ့တ်ကာစ်မျာသကို နာသထောင်ပါ။

အာသလုံသအကောင်သ။

အိမ်စာအနေဖဌင့်၊ သင်သည် အောက်ပါ command ကို run ပါက process file descriptors cat and sleep တလင် မည်သည်ကို စဉ်သစာသရန် အကဌံပဌုအပ်ပါသည်။

[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000

source: www.habr.com

မဟတ်ချက် Add