Mar aan waraysi la yeelanay ayaa la i waydiiyay maxaad samaynaysaa hadii aad hesho adeeg aan shaqaynayn sababtuna ay tahay in saxanka uu gabaabsi yahay?
Dabcan, waxaan ugu jawaabay in aan arki doono waxa meeshan lagu haysto, haddii ay suurtogal tahayna, waan nadiifin doonaa goobta.
Kadibna waraystaha ayaa waydiiyay, ka waran haddii aysan jirin meel banaan oo ku taal qaybta, laakiin sidoo kale ma arkin wax faylal ah oo qaadi doona dhammaan booska?
Tan waxaan ku idhi inaad had iyo jeer eegi karto sharraxayaasha faylka furan, tusaale ahaan amarka lsof, oo aad fahamto codsiga qaatay dhammaan boosaska la heli karo, ka dibna waxaad ku dhaqmi kartaa hadba duruufaha, iyadoo ku xiran haddii xogta loo baahan yahay. .
Waraystuhu wuxuu iga dhex gooyay ereygii ugu dambeeyay, isaga oo ku daray su'aashiisa: "Ka soo qaad inaan u baahnayn xogta, waa kaliya qoraalka debug, laakiin codsigu ma shaqeynayo sababtoo ah ma qori karo debug"?
"Hagaag," waxaan ku jawaabay, "waxaan damin karnaa cilladaha habaynta codsiga oo dib u bilaabi karnaa."
Waraysigii ayaa ka soo horjeestay: "Maya, dib uma bilaabi karno arjiga, wali waxaan haynaa xog muhiim ah oo lagu kaydiyay xusuusta, macaamiisha muhiimka ahna waxay ku xiran yihiin adeegga laftiisa, taas oo aanaan ku qasbi karin inay dib u xirmaan mar kale."
"Hagaag," waxaan idhi, "haddii aynaan dib u bilaabi karin codsiga oo xogtu aanay muhiim noo ahayn, markaa waxaan si fudud u nadiifin karnaa faylkan furan iyada oo loo marayo sharraxaadda faylka, xitaa haddii aynaan ku arkin amarka ls ee nidaamka faylka."
Waraysigii wuu ku farxay, laakiin ma aanan ahayn.
Markaas ayaan is idhi, muxuu qofka imtixaamayaa aqoontayda u sii qotomi waayay? Laakiin maxaa dhacaya haddii xogtu ay muhiim tahay dhammaan ka dib? Maxaa dhacaya haddii aynaan dib u bilaabi karin habka, oo nidaamku u qoro nidaamka faylka qayb aan lahayn meel bannaan? Maxaa dhacaya haddii aynaan lumin karin oo keliya xogta hore loo qoray, laakiin sidoo kale xogta uu habkani qoro ama isku dayo inuu qoro?
Tuzik
Horraantii xirfadayda, waxaan isku dayay inaan abuuro codsi yar oo u baahan inuu kaydiyo macluumaadka isticmaalaha. Kadibna waxaan is idhi, sidee baan ula jaan qaadi karaa isticmaalaha xogtiisa. Tusaale ahaan, waxaan haystaa Ivanov Ivan Ivanovich, oo wuxuu hayaa macluumaad, laakiin sidee baan saaxiib ula yeelan karaa iyaga? Waxaan si toos ah u tilmaami karaa in eyga lagu magacaabo "Tuzik" uu ka tirsan yahay kan Ivan. Laakiin maxaa dhacaya haddii uu beddelo magaciisa iyo halkii uu Ivan noqon lahaa, tusaale ahaan, Olya? Kadibna waxay soo baxaysaa in Olya Ivanovna Ivanova aysan mar dambe yeelan doonin eey, Tuzikkeena ayaa weli ka tirsan doona Ivan aan jirin. Xog ururin siisay isticmaale kasta aqoonsi u gaar ah (ID) ayaa caawiyay xallinta dhibaatadan, Tuzik-kaygana waxa uu ku xidhnaa aqoonsigan, kaas oo, dhab ahaantii, ahaa lambar taxane ah. Sidaa darteed, milkiilaha Ace ayaa lahaa aqoonsiga lambarka 2, iyo wakhti wakhti Ivan ah ayaa ku hoos jiray aqoonsigan, ka dibna Olya wuxuu ku hoos jiray aqoonsi isku mid ah. Dhibaatada bini'aadminimada iyo dhaqashada xoolaha ayaa si dhab ah loo xaliyay.
Sharaxa faylka
Dhibaatada faylka iyo barnaamijka ku shaqeeya faylkan ayaa qiyaastii la mid ah kan eyga iyo ninkayaga. Ka soo qaad in aan furay fayl la yiraahdo ivan.txt oo aan bilaabay in aan ku qoro ereyga tuzik, laakiin kaliya waxa ku guuleystey in aan ku qoro xarafka ugu horreeya ee "t", faylkan waxaa u beddelay qof, tusaale ahaan, olya.txt. Laakiin feylku sidiisii ββayuu ahaanayaa, waxaanan weli rabaa in aan ku duubo faylkayga. Mar kasta oo fayl lagu furo nidaamka wicitaanka
Linux dhexdeeda, maktabadda libca waxay fureysaa 3 fayl oo tilmaame ah codsi kasta oo socda (nidaam), lambarkiisuna yahay 0,1,2. Macluumaad dheeraad ah ayaa laga heli karaa xiriiriyeyaasha
- Sharaxa faylka 0 waxaa loo yaqaan STDIN wuxuuna la xiriiraa gelinta codsiga
- Faylka sharaxa 1 waxaa loo yaqaan STDOUT waxaana isticmaala codsiyada si ay u soo saaraan xogta, sida amarrada daabacaadda
- Faylka sharaxa 2 waxaa loo yaqaan STDERR oo ay isticmaalaan codsiyada si ay u soo saaraan fariimaha khaldan.
Haddii barnaamijkaaga aad furto fayl kasta oo wax lagu akhriyo ama wax lagu qoro, markaas waxay u badan tahay inaad heli doonto aqoonsiga koowaad ee bilaashka ah wuxuuna noqon doonaa lambarka 3.
Liiska sharraxayaasha faylka waa loo eegi karaa nidaam kasta haddii aad taqaan PID-da.
Tusaale ahaan, aynu furno bash console oo aynu eegno PID-da habkayaga
[user@localhost ]$ echo $$
15771
Console labaad aan orodno
[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
Waxaad si badbaado leh iskaga indhatiri kartaa lambarka tilmaame faylka 255 ujeeddooyinka maqaalkan; waxaa loo furay baahiyihiisa bash laftiisa, ee maaha maktabadda ku xidhan.
Hadda dhammaan 3-dii fayl ee sharraxay waxay ku xidhan yihiin aaladda terminalka been abuurka ah
[user@localhost ]$ echo "hello world" > /proc/15771/fd/0
Oo Console ugu horeysay waxaan arki doonaa
[user@localhost ]$ hello world
Jihaynta iyo Dhuumaha
Waxaad si fudud u tirtiri kartaa 3-daan faylal ee sharraxaya hab kasta, oo ay ku jiraan bash, tusaale ahaan iyada oo loo marayo tuubo isku xidha laba habraac, eeg
[user@localhost ]$ cat /dev/zero | sleep 10000
Adiga ayaa amarkan ku maamuli kara dhuuban -f oo arag waxa gudaha ka socda, laakiin si kooban ayaan kuu sheegi doonaa.
Nidaamka bash-bash ee waalidka ee PID 15771 wuxuu qeexayaa amarkeena oo si sax ah u fahmaya inta amar ee aan rabno inaan ku socono, xaaladdeena waxaa jira laba ka mid ah: bisad iyo hurdo. Bash waa ogyahay in ay u baahan tahay in la abuuro laba hab oo ilmo ah, oo lagu daro hal tuubo. Wadar ahaan, bashku wuxuu u baahan doonaa 2 habraac ilmo iyo hal tubo.
Bash waxa uu wadaa wicitaan nidaam ka hor inta aanu abuurin hababka ilmaha
Habka waalidku, waxa ay u eegtahay in ay jirto tubo, laakiin wali ma jiraan habab caruureed:
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
Kadibna isticmaal nidaamka wicitaanka
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
Ha iloobin in clone ay xirto nidaamka oo ay la socdaan dhammaan sharraxayaasha faylka, si ay isku mid u noqdaan habka waalidka iyo kuwa ilmaha. Shaqada nidaamka waalidka ee PID 15771 waa in lala socdo hababka ilmaha, si ay si fudud u sugto jawaabta carruurta.
Sidaa darteed, uma baahna tuubo, waxayna xirtaa sharraxayaasha faylka ee lambarrada 3 iyo 4.
Habka bash-bashka ilmaha ee ugu horreeya ee leh PID 9004, nidaamka ayaa wacaya
Habka ilmaha labaad ee PID 9005, bash wuxuu isticmaalaa dup2 si uu u beddelo sharraxaadda faylka STDIN lambarka 0. Hadda wax kasta oo bashkeena labaad ee PID 9005 akhrin doono waxaa laga akhrin doonaa tuubada.
Taas ka dib, sharraxayaasha faylka ee nambarada 3 iyo 4 ayaa sidoo kale la xiray habka ilmaha, maadaama aan la isticmaalin.
Waxaan si ula kac ah u iska indho-tiray sharraxaadda faylka 255; waxaa loo istcimaalayaa ujeeddooyin gudaha bash laftiisa oo sidoo kale waa la xidhi doonaa hababka carruurta.
Marka xigta, habka ilmaha ugu horreeya ee PID 9004, bash wuxuu bilaabaa isticmaalka nidaamka wicitaanka
Habka ilmaha labaad ee PID 9005, bash wuxuu wadaa fulinta labaad ee aan qeexnay, xaaladdeena /usr/bin/sleep.
Wicitaanka nidaamka exec ma xidho gacan-ku-haynta faylka ilaa lagu furay calanka O_CLOEXEC wakhtiga wicitaanka furan la sameeyay. Xaaladeena, ka dib marka la bilaabo faylasha la fulin karo, dhammaan sharraxayaasha faylka hadda waa la keydin doonaa.
Hubi console-ka:
[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
Sida aad arki karto, tirada gaarka ah ee tuubadayadu waa isku mid labada habraac. Markaa waxaanu xidhiidh ka dhexeeya laba hab oo kala duwan oo isku waalid ah.
Kuwa aan aqoon u lahayn nidaamka wicitaanada ee bash isticmaalo, waxaan aad ugu talinayaa in lagu socodsiiyo amarada iyada oo loo marayo strace oo ay arkaan waxa gudaha ka dhacaya, tusaale ahaan sidan oo kale:
strace -s 1024 -f bash -c "ls | grep hello"
Aan dib ugu laabano dhibka naga haysta booska diskooga oo gabaabsi ah oo aan isku dayno inaan keydino xogta anagoon dib u bilaabin howsha. Aynu qorno barnaamij yar oo ku qori doona qiyaastii 1 megabyte ilbiriqsikiiba diskka. Waxaa intaa dheer, haddii sabab qaar ka mid ah aynaan awoodin in aan u qorno xogta diskka, si fudud ayaanu iska indhatirin doonaa tan oo aan isku dayno inaan mar kale ku qorno xogta hal ilbiriqsi. Tusaalaha aan isticmaalaya Python, waxaad isticmaali kartaa luuqad kasta oo kale oo barnaamijka ah.
[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
Aan socodsiino barnaamijka oo aan eegno sharraxayaasha faylka
[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
Sida aad arki karto, waxaanu haynaa 3-da nooc ee fayl-gale ee qeexitaannada iyo mid kale oo aanu furnay. Aan hubino xajmiga faylka:
[user@localhost ]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 117M Oct 7 16:30 123.txt
Xogta waa la qorayaa, waxaan isku dayeynaa inaan bedelno ogolaanshaha faylka:
[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
Waxaan aragnaa in xogta weli la qorayo, in kasta oo isticmaaleheennu aanu haysan oggolaansho uu ku qoro faylka. Aan isku dayno inaan ka saarno:
[user@localhost ]$ sudo rm 123.txt
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory
Xaggee xogta ku qoran tahay? Oo gabi ahaanba miyay qoran yihiin? Waxaan hubineynaa:
[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)
Haa, sharaxaha faylkayagu wali wuu jiraa oo waxaanu ula dhaqmi karnaa sharaxaha faylka sidii faylkeenii hore, waanu akhrin karnaa, nadiifin karnaa oo koobi karnaa
Aynu eegno xajmiga faylka:
[user@localhost ]$ lsof | grep 123.txt
python 31083 user 3w REG 8,5 19923457 2621522 /home/user/123.txt
Cabbirku waa 19923457. Aan isku dayno inaan tirtirno faylka:
[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
Sida aad arki karto, cabbirka feylku waa sii kordhayaa oo jirkeena ma shaqayn. Aynu eegno dukumentiyada wicitaanka nidaamka
with open("123.txt", "w") as f:
waa inaan dhignaa
with open("123.txt", "a") as f:
Ku hubinta calanka "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
oo leh calanka "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
Barnaamijaynta hannaan hore u socday
Inta badan barnaamijyada, marka ay abuurayaan oo ay tijaabinayaan barnaamijyada, waxay isticmaalaan debuggers (tusaale GDB) ama heerarka kala duwan ee gelitaanka codsiga. Linux waxa ay siisaa awood ay ku qorto oo ay u beddesho barnaamij horeba u socday, tusaale ahaan, bedelida qiyamka doorsoomayaasha, dejiso meel goyn, iwm, iwm.
Ku soo noqoshada su'aasha asalka ah ee ku saabsan boos disk ku filan oo lagu qoro fayl, aan isku dayno inaan ka dhigno dhibaatada.
Aan u abuurno fayl qaybtayada, kaas oo aan ku dhejin doono disk gaar ah:
[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 ~]$
Aan abuurno nidaam faylal:
[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 ~]$
Ku dheji nidaamka faylka:
[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
Waxaan la abuurnay hagaha mulkiilahayaga:
[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs
Aan furno faylka si loogu qoro kaliya barnaamijkayaga:
with open("/mnt/logs/123.txt", "w") as f:
Daahfurka
[user@localhost ]$ python openforwrite.py
Waxaan sugeynaa dhowr ilbiriqsi
[user@localhost ~]$ df -h | grep mnt
/dev/loop0 8.7M 8.0M 0 100% /mnt
Markaa, waxaynu haynaa dhibaatada lagu tilmaamay bilawga maqaalkan. Meel banaan 0, 100% waa la qabsaday.
Waxaan xasuusannahay in marka loo eego shuruudaha shaqada, waxaan isku dayeynaa inaan duubno xog aad muhiim u ah oo aan la lumin karin. Isla mar ahaantaana, waxaan u baahanahay inaan hagaajino adeegga iyada oo aan dib loo bilaabin habka.
Aynu nidhaahno waxaan weli haysanaa boos disk, laakiin qayb ka duwan, tusaale ahaan / guriga.
Aan isku dayno inaan "dib-u-bardhig ku samayno" koodkayaga.
Aynu eegno PID-da habkayaga, kaas oo cunay dhammaan meelihii saxanka:
[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
Ku xidh habka gdb
[user@localhost ~]$ gdb -p 10078
...
(gdb)
Aynu eegno sharraxayaasha faylka furan:
(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
Waxaan eegnaa macluumaadka ku saabsan faylka sharraxaaha lambarka 3, kaas oo na daneynaya
(gdb) shell cat /proc/10078/fdinfo/3
pos: 8189952
flags: 0100001
mnt_id: 482
Anigoo maskaxda ku hayna waxa nidaamka loo yaqaan Python sameeyo (eeg xagga sare halka aan ku orodnay oo aan helnay wicitaanka furan), marka la shaqeynayo koodkayaga si aan u furno faylka, annagu sidaas oo kale ayaan sameynaa annagoo ka wakiil ah hannaankayaga, laakiin waxaan u baahanahay O_WRONLY|O_CREAT| Qaybaha O_TRUNC waxay ku beddelaan qiime tiro Si tan loo sameeyo, fur ilaha kernel-ka, tusaale ahaan
#Qeex O_QALDOON 00000001
# qeex O_CREAT 00000100
# qeex O_TRUNC 00001000
Waxaan isku darnaa dhammaan qiyamka hal, waxaan helnaa 00001101
Wicitaankeena waxaan ka wadnaa gdb
(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4
Markaa waxaanu helnay sharraxa faylka cusub oo leh lambarka 4 iyo fayl cusub oo furan oo qayb kale ah, waxaanu hubinay:
(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
Waxaan ku xasuusanaa tusaalaha tuubada - sida bash u beddelo sharraxayaasha faylka, waxaanan horay u baranay nidaamka dup2 call.
Waxaan isku dayeynaa in aan hal fayl ku bedelno mid kale
(gdb) call dup2(4,3)
$2 = 3
Hubinta:
(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
Waxaan xireynaa sharraxaaha faylka 4, maadaama aanan u baahnayn:
(gdb) call close (4)
$1 = 0
Oo ka bax 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
Hubinta faylka cusub:
[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
Sida aad arki karto, xogta waxaa lagu qoraa fayl cusub, aan hubinno kii hore:
[user@localhost ~]$ ls -lah /mnt/logs/123.txt
-rw-rw-r-- 1 user user 7.9M Oct 8 11:08 /mnt/logs/123.txt
Wax xog ah oo lumay ma jirto, codsigu wuu shaqeeyaa, diiwaannada ayaa lagu qoraa meel cusub.
Aynu hawsha yara adkayno
Aynu qiyaasno in xogtu ay muhiim noo tahay, laakiin ma haysanno meel disk ah mid ka mid ah qaybaha oo ma isku xiri karno diskka.
Waxa aan samayn karno ayaa ah in aan xogtayada meel ku hagano, tusaale ahaan in aan tuubooyin u gudbino, oo markeedana xogta laga soo wareejiyo beebka una gudubto shabakadda iyada oo loo marayo barnaamijka qaarkood, tusaale ahaan netcat.
Waxaan samayn karnaa tuubo magac leh oo leh amarka mkfifo. Waxay ku abuuri doontaa faylka been abuurka ah ee nidaamka faylka xitaa haddii aysan jirin meel bannaan oo ku taal.
Dib u bilow codsiga oo hubi:
[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
Ma jiro meel saxan ah, laakiin waxaan si guul leh ugu abuurnay tuubo magaceedu halkaas:
[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
Hadda waxaan u baahanahay inaan si uun u duubno dhammaan xogta ku socota tuubadan oo loo diro server kale iyada oo loo marayo shabakadda; isla netcat ayaa ku habboon tan.
Serverka remote-server.example.com ayaanu ku bilownay
[user@localhost ~]$ nc -l 7777 > 123.txt
Seerfarkeena dhibaatada leh waxaan ku furaynaa terminal gooni ah
[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe
Hadda dhammaan xogta ku dhammaata tuubada waxay si toos ah u tagi doontaa stdin ee netcat, taas oo u diri doonta shabakadda dekedda 7777.
Waxa kaliya ee ay tahay inaan sameyno waa inaan bilowno inaan xogtayada ku qorno tuubadaan magacaaban.
Waxaan horey u haynay codsigu:
[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
Dhammaan calamada, waxaan kaliya uga baahanahay O_WRONLY maadaama feylku uu hore u jiray umana baahnin inaanu nadiifinno
[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
Hubinta fog ee server-ka remote-server.example.com
[user@localhost ~]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 38M Oct 8 14:21 123.txt
Xogtu waa soo socotaa, waxaan hubineynaa server-ka dhibaatada
[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
Xogta waa la keydiyay, dhibaatada waa la xaliyay.
Waxaan fursadan uga faaβiidaysanayaa in aan salaan ku idhaahdo asxaabtayda Degiro.
Dhageyso muuqaalada Radio-T
Wanaag oo dhan.
Shaqa-guri ahaan, waxaan kuu soo jeedinayaa inaad ka fikirto waxa ku jiri doona nidaamka faylka sharraxaadaha bisad iyo hurdo haddii aad maamusho amarkan soo socda:
[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000
Source: www.habr.com