Ngesinye isikhathi, ku-interview, ngabuzwa ukuthi ungenzenjani uma uthola isevisi ephukile ngenxa yokuthi i-disk iphelelwe isikhala?
Yebo, ngaphendula ngathi ngizobona ukuthi le ndawo yenzani futhi, uma kungenzeka, ngizoyihlanza indawo.
Khona-ke oxoxisana naye wabuza, kuthiwani uma kungekho ndawo yamahhala ekuhlukaniseni, kodwa futhi awuwaboni amafayela azothatha yonke indawo?
Kulokhu, ngithe ungahlala ubheka izichazi zefayela ezivulekile, isibonelo, ngomyalo we-lsof futhi uqonde ukuthi yiluphi uhlelo lokusebenza oluthathe yonke indawo etholakalayo, bese ungenza ngokuvumelana nezimo, kuye ngokuthi idatha iyadingeka yini. .
Oxoxisana naye wangiphazamisa ezwini lokugcina, wanezela embuzweni wakhe: "Ake sithi asiyidingi idatha, irekhodi lokulungisa iphutha, kodwa isicelo siphansi ngoba asikwazi ukubhala ukulungisa iphutha"?
βKulungile,β ngiphendule, βsingavala ukulungisa iphutha kulungiselelo lohlelo bese siluqale kabusha.β
Obuza imibuzo uphikile wathi: βCha, asikwazi ukuqalisa kabusha isicelo, sisenedatha ebalulekile enkumbulweni, futhi amakhasimende abalulekile axhunywe kusevisi ngokwayo, esingeke siphoqe ukukuxhuma kabusha.β
βKulungile,β ngathi, βuma singakwazi ukuqalisa kabusha uhlelo lokusebenza futhi asinandaba nedatha, singavele sisule leli fayela elivuliwe ngesichazi sefayela, noma singaliboni ku-ls. umyalo ohlelweni lwefayela.β
Owayebuza imibuzo waneliseka, kodwa angizange.
Ngabe sengicabanga, kungani umuntu ohlola ulwazi lwami engambi ajule? Kodwa kuthiwani uma idatha ibalulekile phela? Kuthiwani uma singakwazi ukuqala kabusha inqubo, futhi ngesikhathi esifanayo le nqubo ibhalela ohlelweni lwefayela ekuhlukaniseni okungenayo indawo yamahhala? Kuthiwani uma singakwazi ukulahlekelwa hhayi kuphela idatha esivele ibhaliwe, kodwa futhi idatha le nqubo ebhalayo noma ezama ukuyibhala?
Tuzik
Ekuqaleni komsebenzi wami, ngangizama ukudala uhlelo lokusebenza oluncane oludinga ukugcina ulwazi olumayelana nabasebenzisi. Ngabe sengicabanga, ngingafanisa kanjani umsebenzisi nedatha yakhe. Ngokwesibonelo, ngine-Ivanov Ivan Ivanovich, futhi uneminye idatha, kodwa kanjani ukwenza ubungane nabo? Ngingakhomba ngqo ukuthi inja okuthiwa "Tuzik" ingeyalo Ivan. Kodwa kuthiwani uma eshintsha igama lakhe futhi esikhundleni sika-Ivan uba, isibonelo, u-Olya? Khona-ke kuzovela ukuthi u-Olya Ivanovna Ivanova wethu ngeke esaba nenja, futhi iTuzik yethu izobe ingeka-Ivan ongekho. I-database yasiza ukuxazulula le nkinga, eyanikeza umsebenzisi ngamunye isihlonzi esiyingqayizivele (ID), futhi i-Tuzik yami yayiboshwe kule ID, empeleni, kwakuyinombolo ye-serial nje. Ngakho, umnikazi we-tuzik wayenenombolo ye-ID 2, futhi ngesikhathi esithile u-Ivan wayengaphansi kwale ID, bese u-Olya eba ngaphansi kwe-ID efanayo. Inkinga yesintu nokufuywa kwezilwane yaxazululeka ngokoqobo.
Isichazi sefayela
Inkinga yefayela nohlelo olusebenza naleli fayela icishe ifane neyenja yethu nabantu. Ake sithi ngivule ifayela elibizwa ngokuthi ivan.txt futhi ngaqala ukubhala igama elithi tuzik kulo, kodwa ngakwazi ukubhala kuphela uhlamvu lokuqala "t" efayeleni, futhi leli fayela laqanjwa kabusha othile, isibonelo, ku-olya.txt. Kodwa ifayela liyafana futhi ngisafuna ukubhala i-ace kulo. Njalo uma uvula ifayela ngekholi yesistimu
Ku-Linux, umtapo wezincwadi we-libc uvula amafayela angu-3 achazayo wohlelo ngalunye olusebenzayo (inqubo), enezinombolo 0,1,2. Olunye ulwazi ungaluthola kuzixhumanisi
- Isichazi sefayela esingu-0 sibizwa nge-STDIN futhi sihlotshaniswa nokufaka kohlelo lokusebenza.
- Isichazi sefayela 1 sibizwa nge-STDOUT futhi sisetshenziswa izinhlelo zokusebenza eziphumayo njengemiyalo yokuphrinta.
- Isichazi sefayela 2 sinegama elithi STDERR futhi sisetshenziswa izinhlelo zokusebenza ukukhipha imilayezo yephutha.
Uma ohlelweni lwakho uvula noma yiliphi ifayela ukuze ufunde noma ubhale, khona-ke cishe uzothola i-ID yokuqala yamahhala futhi kuyoba inombolo 3.
Ungabona uhlu lwezincazelo zefayela zanoma iyiphi inqubo uma uyayazi i-PID yayo.
Isibonelo, ake sivule ikhonsoli nge-bash futhi sibone i-PID yenqubo yethu
[user@localhost ]$ echo $$
15771
Kwikhonsoli yesibili, gijima
[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
Ungakwazi ukuziba ngokuphephile isichazi sefayela esinenombolo 255 ngaphakathi kohlaka lwalesi sihloko, sivulelwe izidingo zakho nge-bash ngokwayo, hhayi ngelabhulali exhunyiwe.
Manje wonke amafayela ezichazi ezi-3 ahlotshaniswa nedivayisi ye-pseudo-terminal
[user@localhost ]$ echo "hello world" > /proc/15771/fd/0
Futhi kukhonsoli yokuqala sizobona
[user@localhost ]$ hello world
Qondisa kabusha futhi Ipayipi
Ungakwazi ukukhipha kalula lawa mafayela achazayo angu-3 kunoma iyiphi inqubo, kuhlanganise ne-bash, isibonelo, ngepayipi (ipayipi) elixhuma izinqubo ezimbili, bona
[user@localhost ]$ cat /dev/zero | sleep 10000
Lo myalo ungawusebenzisa ngokwakho uhlaka -f futhi ngibone ukuthi kwenzekani ngaphakathi, kodwa ngizolenza libe lifushane.
Inqubo yethu ye-bash yomzali ene-PID 15771 idlulisa umyalo wethu futhi iqonda kahle ukuthi mingaki imiyalo esifuna ukuyisebenzisa, kithi kukhona emibili yayo: ikati nokulala. U-Bash uyazi ukuthi idinga ukudala izinqubo ezimbili zezingane, futhi ihlanganiswe ibe yipayipi elilodwa. Sekukonke, i-bash izodinga izinqubo zezingane ezi-2 kanye nepayipi elilodwa.
Ngaphambi kokudala izinqubo zengane, i-bash iqhuba ikholi yesistimu
Ngenqubo yomzali, kubukeka sengathi ipayipi selivele likhona, kodwa azikho izinqubo zengane okwamanje:
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
Bese usebenzisa ikholi yesistimu
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
Ungakhohlwa ukuthi i-clone ihlanganisa inqubo kanye nazo zonke izichazi zefayela, ngakho zizofana enqubweni yabazali nasezinganeni. Umsebenzi wenqubo yomzali nge-PID 15771 ukuqapha izinqubo zengane, ngakho-ke ilinda impendulo evela ezinganeni.
Ngakho-ke, akadingi ipayipi, futhi uvala izichazi zefayela ngezinombolo 3 no-4.
Enqubweni yokuqala ye-bash yengane ene-PID 9004, ucingo lwesistimu
Enqubweni yesibili yengane ene-PID 9005, i-bash dup2s ifayela kunombolo yesichazi se-STDIN 0. Manje yonke into ezofundwa i-bash yethu yesibili ene-PID 9005 izofundwa epayipini.
Ngemuva kwalokho, izichazi zefayela ezinezinombolo 3 no-4 nazo zivaliwe ezinqubweni zezingane, njengoba zingasasetshenziswa.
Ngiziba ngamabomu i-descriptor yefayela engu-255, isetshenziswa ngaphakathi yi-bash ngokwayo futhi izovalwa ezinqubweni zezingane.
Okulandelayo, kwinqubo yengane yokuqala nge-PID 9004, i-bash iqala ngekholi yesistimu
Enqubweni yesibili yengane ene-PID 9005, i-bash isebenzisa okwesibili okusebenzisekayo esikushilo, esimweni sethu /usr/bin/sleep.
Ikholi yesistimu ye-exec ayizivali izichazi zefayela ngaphandle kokuthi zivulwe ngefulegi le-O_CLOEXEC ngesikhathi kushaya ucingo oluvuliwe. Esimweni sethu, ngemva kokusebenzisa amafayela asebenzisekayo, zonke izincazelo zefayela zamanje zizogcinwa.
Ihlola ikhonsoli:
[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
Njengoba ubona, inombolo eyingqayizivele yepayipi yethu iyafana kuzo zombili izinqubo. Ngakho, sinokuxhumana phakathi kwezinqubo ezimbili ezihlukene nomzali oyedwa.
Kulabo abangazi kahle izingcingo zesistimu ezisetshenziswa yi-bash, ngincoma kakhulu ukusebenzisa imiyalo nge-strace futhi ubone ukuthi kwenzekani ngaphakathi, isibonelo, kanje:
strace -s 1024 -f bash -c "ls | grep hello"
Ake sibuyele emuva enkingeni yethu yokuphelelwa isikhala sediski futhi sizame ukulondoloza idatha ngaphandle kokuqalisa kabusha inqubo. Masibhale uhlelo oluncane oluzobhalela kudiski cishe i-megabyte eyi-1 ngomzuzwana. Ngaphezu kwalokho, uma ngesizathu esithile asikwazanga ukubhala idatha kudiski, sizomane sikuzibe lokhu futhi sizame ukubhala idatha futhi ngomzuzwana. Esibonelweni engisebenzisa iPython, ungasebenzisa noma yiluphi olunye ulimi lokuhlela.
[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
Qalisa uhlelo bese ubheka izichazi zefayela
[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
Njengoba ubona, sinezichazi zefayela ezi-3 ezijwayelekile kanye nenye esiyivulile. Ake sihlole usayizi wefayela:
[user@localhost ]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 117M Oct 7 16:30 123.txt
idatha ibhaliwe, sizama ukushintsha amalungelo kufayela:
[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
Siyabona ukuthi idatha isabhalwa, nakuba umsebenzisi wethu engenalo ilungelo lokubhalela ifayela. Ake sizame ukuyisusa:
[user@localhost ]$ sudo rm 123.txt
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory
Ibhalwe kuphi idatha? Futhi zibhaliwe nhlobo? Siyahlola:
[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)
Yebo, isichazi sefayela lethu sisekhona, futhi singasebenza nalesi sichazi sefayela njengefayela lethu elidala, singalifunda, silihlanze futhi silikopishe.
Bheka usayizi wefayela:
[user@localhost ]$ lsof | grep 123.txt
python 31083 user 3w REG 8,5 19923457 2621522 /home/user/123.txt
Usayizi wefayela ngu-19923457. Izama ukusula ifayela:
[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
Njengoba ubona, usayizi wefayela uyanda kuphela futhi isiqu sethu asizange sisebenze. Ake siphendukele kumadokhumenti ocingweni lwesistimu
with open("123.txt", "w") as f:
kufanele sibeke
with open("123.txt", "a") as f:
Ihlola ngefulegi elithi "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
kanye nefulegi elithi "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
Ukuhlela inqubo esivele iyasebenza
Ngokuvamile, lapho kwakhiwa futhi kuhlolwa uhlelo, abahleli bezinhlelo basebenzisa izilungisi (isibonelo, i-GDB) noma amaleveli ahlukahlukene okungena kuhlelo lokusebenza. I-Linux inikeza ikhono lokubhala nokushintsha uhlelo oseluvele lusebenza, njengokushintsha amanani ezinto eziguquguqukayo, ukubeka i-breakpoint, njalo njalo njalo.
Ukubuyela embuzweni wokuqala mayelana nokuntuleka kwesikhala sediski sokubhala ifayela, ake sizame ukulingisa inkinga.
Masidale ifayela lokuhlukanisa kwethu, esizolifaka njengedrayivu ehlukile:
[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 ~]$
Masidale isistimu yefayela:
[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 ~]$
Masikhweze isistimu yefayela:
[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
Dala uhla lwemibhalo nomnikazi wethu:
[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs
Masivule ifayela ukuze sibhale ohlelweni lwethu kuphela:
with open("/mnt/logs/123.txt", "w") as f:
Yethula
[user@localhost ]$ python openforwrite.py
Ilinde imizuzwana embalwa
[user@localhost ~]$ df -h | grep mnt
/dev/loop0 8.7M 8.0M 0 100% /mnt
Ngakho, sithole inkinga echazwe ekuqaleni kwalesi sihloko. Isikhala samahhala esingu-0, sithathe u-100%.
Siyakhumbula ukuthi ngokwemibandela yenkinga, sizama ukurekhoda idatha ebaluleke kakhulu engeke ilahleke. Futhi ngokwenza kanjalo, sidinga ukulungisa isevisi ngaphandle kokuqalisa kabusha inqubo.
Ake sithi sisenesikhala sediski, kodwa ekuhlukaniseni okuhlukile, isibonelo, ngaphakathi / ekhaya.
Ake sizame "ukuhlela kabusha ngokuphazima kweso" ikhodi yethu.
Sibheka i-PID yenqubo yethu, edle sonke isikhala sediski:
[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
Ixhuma kunqubo nge-gdb
[user@localhost ~]$ gdb -p 10078
...
(gdb)
Sibheka izichazi zefayela ezivulekile:
(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
Sibheka ulwazi mayelana nencazelo yefayela enenombolo 3, esiyithandayo
(gdb) shell cat /proc/10078/fdinfo/3
pos: 8189952
flags: 0100001
mnt_id: 482
Sikhumbula ukuthi iPython yesistimu yenzani (bona ngenhla lapho sigijime khona futhi sathola ucingo oluvuliwe), ngenkathi sicubungula ikhodi yethu ukuze sivule ifayela, senza okufanayo ngokwethu egameni lenqubo yethu, kodwa sidinga okuthi O_WRONLY|O_CREAT| O_TRUNC amabhithi athatha isikhundla senani lenombolo. Ukuze wenze lokhu, vula imithombo ye-kernel, isibonelo
#chaza O_WRONLY 00000001
#chaza O_CREAT 00000100
#chaza O_TRUNC 00001000
Sihlanganisa wonke amanani kokukodwa, sithola 00001101
Isebenzisa ikholi yethu kusuka ku-gdb
(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4
Ngakho-ke sithole isichazi sefayela esisha esinenombolo 4 kanye nefayela elisha elivuliwe kwenye ingxenye, hlola:
(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
Sikhumbula isibonelo ngepayipi - ukuthi i-bash ishintsha kanjani izichazi zefayela, futhi sesiyifundile ikholi yesistimu ye-dup2.
Izama ukufaka isichazi sefayela esisodwa esikhundleni sesinye
(gdb) call dup2(4,3)
$2 = 3
Sihlola:
(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
Vala isichazi sefayela 4, njengoba singasidingi:
(gdb) call close (4)
$1 = 0
Bese uphuma ku-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
Ihlola ifayela elisha:
[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
Njengoba ubona, idatha ibhalelwa ifayela elisha, sibheka elidala:
[user@localhost ~]$ ls -lah /mnt/logs/123.txt
-rw-rw-r-- 1 user user 7.9M Oct 8 11:08 /mnt/logs/123.txt
Idatha ayilahlekile, uhlelo lokusebenza lusebenza, izingodo zibhalwa endaweni entsha.
Asenze izinto zibe nzima nakakhulu
Cabanga ukuthi idatha ibalulekile kithi, kodwa asinaso isikhala sediski kunoma yiziphi izingxenye futhi asikwazi ukuxhuma idiski.
Esingakwenza ukuqondisa kabusha idatha yethu ndawana thize, ngokwesibonelo, epayipini, futhi siqondise kabusha idatha isuka epayipini iye kunethiwekhi ngohlelo oluthile, olufana ne-netcat.
Singakha ipayipi elinegama ngomyalo we-mkfifo. Izodala ifayela elingumbumbulu ohlelweni lwefayela, ngisho noma singekho isikhala samahhala kulo.
Qala kabusha uhlelo bese uhlola:
[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
Asikho isikhala sediski, kodwa sakha ngempumelelo ipayipi eliqanjwe igama lapho:
[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
Manje sidinga ngandlela thize ukugoqa yonke idatha engena kuleli payipi kwenye iseva ngenethiwekhi, i-netcat efanayo ifanele lokhu.
Kuseva ye-remote-server.example.com, sebenzisa
[user@localhost ~]$ nc -l 7777 > 123.txt
Kuseva yethu yenkinga, sebenzisa itheminali ehlukile
[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe
Manje yonke idatha engena epayipini izoya ngokuzenzakalelayo ku-stdin ku-netcat, ezoyithumela kunethiwekhi ku-port 7777.
Okufanele sikwenze ukuqala ukubhala ama-data ethu kuleli payipi eliqanjwe igama.
Sesivele sinalo uhlelo lokusebenza olusebenzayo:
[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
Kuwo wonke amafulegi, sidinga kuphela okuthi O_WRONLY njengoba ifayela selivele likhona futhi asikho isidingo sokulisula.
[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
Ihlola iseva ekude-server.example.com
[user@localhost ~]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 38M Oct 8 14:21 123.txt
Idatha iyeza, sihlola iseva yenkinga
[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
Idatha igcinwa, inkinga ixazululiwe.
Ngithatha leli thuba ukubingelela ozakwethu baseDegiro.
Lalela amaphodikasti eRadio-T.
Konke kuhle.
Njengomsebenzi wasekhaya, ngiphakamisa ukuthi ngicabange ngalokho okuzoba kuzichazi zefayela lekati nenqubo yokulala uma usebenzisa umyalo olandelayo:
[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000
Source: www.habr.com