Isichazi sefayela ku-Linux esinezibonelo

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 evulekile kunoma yiluphi ulimi lokuhlela, ngithola i-ID ehlukile engikhomba efayeleni, le ID iyisichazi sefayela. Futhi akukhathalekile ukuthi yini futhi ubani olandela leli fayela, lingacishwa, lingaqanjwa kabusha, lingashintsha umnikazi walo noma lithathe amalungelo okufunda nokubhala, ngisazofinyelela kulo, ngoba ngesikhathi ngivula ifayela nganginamalungelo okulifunda kanye / noma ukulibhala futhi ngakwazi ukuqala ukusebenza nalo, okusho ukuthi kufanele ngiqhubeke ngenza kanjalo.

Ku-Linux, umtapo wezincwadi we-libc uvula amafayela angu-3 achazayo wohlelo ngalunye olusebenzayo (inqubo), enezinombolo 0,1,2. Olunye ulwazi ungaluthola kuzixhumanisi indoda stdio ΠΈ indoda stdout

  • 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 /dev/pts, kodwa sisengakwazi ukuwasebenzisa, isibonelo, sebenzisa ikhonsoli yesibili

[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 ipayipi futhi ithola izichazi zefayela ezintsha kusigcinalwazi sepayipi yesikhashana, kodwa le buffer ayikaxhumi izinqubo zethu zezingane ezimbili nganoma iyiphi indlela.

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 i-clone i-bash idala izinqubo ezimbili zezingane, futhi izinqubo zethu ezintathu zizobukeka kanje:

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 dup2, ishintsha inombolo yethu yesichazi sefayela le-STDOUT 1 kusichazi sefayela esikhomba ipayipi, kithina inombolo 3. Ngakho, yonke into ingane yokuqala ecubungula nge-PID 9004 ebhala ku-STDOUT izowela ngokuzenzakalelayo kubhafa yepayipi.

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 Exec ifayela elisebenzisekayo esilicacisile emugqeni womyalo, kithina ngu/usr/bin/cat.

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 evulekile. Uma sisebenzisa ifulegi le-O_APPEND lapho sivula ifayela, ngakho-ke ngokubhala ngakunye, isistimu yokusebenza ihlola usayizi wefayela bese ibhala idatha kuze kube sekupheleni kwefayela, futhi ikwenze nge-athomu. Lokhu kuvumela imicu eminingi noma izinqubo ukuthi zibhalele ifayela elifanayo. Kodwa kukhodi yethu asilisebenzisi leli fulegi. Singabona usayizi wefayela ohlukile ku-lsof ngemva kwe-trunk kuphela uma sivula ifayela ukuze libhalwe, okusho ukuthi kukhodi yethu, esikhundleni sokuthi

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 lapha futhi ubone ukuthi yimaphi amafulegi anesibopho sani

#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

Engeza amazwana