Ni ẹẹkan, lakoko ifọrọwanilẹnuwo, a beere lọwọ mi, kini iwọ yoo ṣe ti o ba rii iṣẹ kan ti ko ṣiṣẹ nitori otitọ pe disk naa ti pari ni aaye?
Dajudaju, Mo dahun pe Emi yoo rii ohun ti o gba nipasẹ ibi yii ati pe, ti o ba ṣeeṣe, Emi yoo sọ ibi naa di mimọ.
Lẹhinna olubẹwo naa beere, kini ti ko ba si aaye ọfẹ lori ipin, ṣugbọn iwọ ko tun rii eyikeyi awọn faili ti yoo gba gbogbo aaye naa?
Lati eyi Mo sọ pe o le nigbagbogbo wo awọn apejuwe faili ṣiṣi, fun apẹẹrẹ pẹlu aṣẹ lsof, ki o loye iru ohun elo ti o gba gbogbo aaye ti o wa, lẹhinna o le ṣe ni ibamu si awọn ipo, da lori boya o nilo data naa. .
Onirohin naa da mi duro lori ọrọ ti o kẹhin, ti o fi kun si ibeere rẹ: "Ti a ko nilo data naa, o kan jẹ aṣiṣe aṣiṣe, ṣugbọn ohun elo naa ko ṣiṣẹ nitori ko le kọ aṣiṣe kan"?
“Dara,” Mo dahun, “a le paa yokokoro ni atunto ohun elo ki a tun bẹrẹ.”
Olubẹwẹ naa tako: “Rara, a ko le tun ohun elo naa bẹrẹ, a tun ni data pataki ti a fipamọ sinu iranti, ati pe awọn alabara pataki ti sopọ mọ iṣẹ naa funrararẹ, eyiti a ko le fi ipa mu lati tun sopọ mọ.”
“Dara,” Mo sọ, “ti a ko ba le tun ohun elo naa bẹrẹ ati pe data ko ṣe pataki si wa, lẹhinna a le jiroro ni nu faili ṣiṣi yii kuro nipasẹ oluṣapejuwe faili, paapaa ti a ko ba rii ni aṣẹ ls lori eto faili."
Inú olùfọ̀rọ̀wánilẹ́nuwò náà dùn, ṣùgbọ́n mi ò rí bẹ́ẹ̀.
Nigbana ni mo ro pe, kilode ti eniyan naa ko ṣe idanwo imọ mi jinlẹ? Ṣugbọn kini ti data ba ṣe pataki lẹhin gbogbo? Kini ti a ko ba le tun ilana kan bẹrẹ, ati ilana naa kọwe si eto faili lori ipin ti ko ni aaye ọfẹ? Kini ti a ko ba le padanu kii ṣe data nikan ti a ti kọ tẹlẹ, ṣugbọn tun data ti ilana yii kọ tabi gbiyanju lati kọ?
Tuzik
Ni kutukutu iṣẹ mi, Mo gbiyanju lati ṣẹda ohun elo kekere kan ti o nilo lati tọju alaye olumulo. Ati lẹhinna Mo ronu, bawo ni MO ṣe le baamu olumulo si data rẹ. Fun apẹẹrẹ, Mo ni Ivanov Ivan Ivanovich, ati pe o ni alaye diẹ, ṣugbọn bawo ni MO ṣe le ṣe ọrẹ pẹlu wọn? Mo le tọka si taara pe aja ti a npè ni "Tuzik" jẹ ti Ivan yii. Ṣugbọn kini ti o ba yi orukọ rẹ pada ati dipo Ivan di, fun apẹẹrẹ, Olya? Lẹhinna o yoo jade pe Olya Ivanovna Ivanova wa ko ni ni aja kan mọ, ati Tuzik wa yoo tun jẹ ti Ivan ti ko si tẹlẹ. Ipamọ data ti o fun olumulo kọọkan ni idanimọ alailẹgbẹ (ID) ṣe iranlọwọ lati yanju iṣoro yii, ati pe Tuzik mi ni a so mọ ID yii, eyiti, ni otitọ, jẹ nọmba ni tẹlentẹle nikan. Bayi, oniwun tuzik ni nọmba ID 2, ati ni akoko diẹ Ivan wa labẹ ID yii, lẹhinna Olya di labẹ ID kanna. Iṣoro ti eda eniyan ati ẹran-ọsin ni a ti yanju ni adaṣe.
Apejuwe faili
Iṣoro faili ati eto ti o ṣiṣẹ pẹlu faili yii jẹ isunmọ kanna bii ti aja ati eniyan wa. Ṣebi Mo ṣii faili kan ti a pe ni ivan.txt ati bẹrẹ kikọ ọrọ tuzik sinu rẹ, ṣugbọn iṣakoso nikan lati kọ lẹta akọkọ “t” ninu faili naa, ati pe faili yii jẹ lorukọmii nipasẹ ẹnikan, fun apẹẹrẹ, si olya.txt. Ṣugbọn faili naa wa kanna, ati pe Mo tun fẹ lati ṣe igbasilẹ Ace mi ninu rẹ. Ni gbogbo igba ti faili ba ṣii nipasẹ ipe eto kan
Ni Lainos, ile-ikawe libc ṣii awọn faili alapejuwe 3 fun ohun elo nṣiṣẹ kọọkan (ilana), nọmba 0,1,2. Alaye diẹ sii ni a le rii lori awọn ọna asopọ
- Apejuwe faili 0 ni a pe ni STDIN ati pe o ni nkan ṣe pẹlu titẹ ohun elo
- Apejuwe faili 1 ni a pe ni STDOUT ati pe awọn ohun elo lo lati gbejade data, gẹgẹbi awọn aṣẹ titẹ
- Apejuwe faili 2 ni a pe ni STDERR ati pe awọn ohun elo lo lati gbejade awọn ifiranṣẹ aṣiṣe.
Ti o ba wa ninu eto rẹ ti o ṣii eyikeyi faili fun kika tabi kikọ, lẹhinna o ṣeese julọ iwọ yoo gba ID ọfẹ akọkọ ati pe yoo jẹ nọmba 3.
Awọn atokọ ti awọn apejuwe faili le ṣee wo fun ilana eyikeyi ti o ba mọ PID rẹ.
Fun apẹẹrẹ, jẹ ki a ṣii console bash ki o wo PID ti ilana wa
[user@localhost ]$ echo $$
15771
Ni awọn keji console jẹ ki ká ṣiṣe
[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
O le foju foju foju foju nọmba olutumọ faili 255 lailewu fun awọn idi ti nkan yii; o ṣii fun awọn iwulo rẹ nipasẹ bash funrararẹ, kii ṣe nipasẹ ile-ikawe ti o sopọ mọ.
Bayi gbogbo awọn faili apejuwe 3 ni nkan ṣe pẹlu ẹrọ ebute pseudo
[user@localhost ]$ echo "hello world" > /proc/15771/fd/0
Ati ni akọkọ console a yoo ri
[user@localhost ]$ hello world
Àtúnjúwe ati Pipe
O le ni rọọrun daarẹ awọn faili apejuwe 3 wọnyi ni eyikeyi ilana, pẹlu ni bash, fun apẹẹrẹ nipasẹ paipu kan ti o so awọn ilana meji pọ, wo
[user@localhost ]$ cat /dev/zero | sleep 10000
O le ṣiṣe aṣẹ yii funrararẹ pẹlu strace -f ati ki o wo ohun ti n ṣẹlẹ ninu, sugbon Emi yoo so fun o ni soki.
Ilana bash obi wa pẹlu PID 15771 ṣe itupalẹ aṣẹ wa ati loye deede iye awọn aṣẹ ti a fẹ ṣiṣẹ, ninu ọran wa awọn meji wa: ologbo ati oorun. Bash mọ pe o nilo lati ṣẹda awọn ilana ọmọ meji, ki o si dapọ wọn sinu paipu kan. Ni apapọ, bash yoo nilo awọn ilana ọmọ 2 ati paipu kan.
Bash nṣiṣẹ ipe eto ṣaaju ṣiṣẹda awọn ilana ọmọ
Fun ilana obi, o dabi pe paipu ti wa tẹlẹ, ṣugbọn ko si awọn ilana ọmọ sibẹsibẹ:
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
Lẹhinna lo ipe eto
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
Maṣe gbagbe pe ẹda oniye ṣe ilana naa pẹlu gbogbo awọn apejuwe faili, nitorinaa wọn yoo jẹ kanna ni ilana obi ati ninu awọn ọmọ. Iṣẹ ti ilana obi pẹlu PID 15771 ni lati ṣe atẹle awọn ilana ọmọ, nitorinaa o kan duro fun esi lati ọdọ awọn ọmọde.
Nitorinaa, ko nilo paipu, ati pe o tilekun awọn apejuwe faili ti o jẹ nọmba 3 ati 4.
Ninu ilana bash ọmọ akọkọ pẹlu PID 9004, ipe eto naa
Ninu ilana ọmọ keji pẹlu PID 9005, bash nlo dup2 lati yi olupe faili STDIN nọmba 0. Bayi ohun gbogbo ti bash keji wa pẹlu PID 9005 yoo ka ni yoo ka lati paipu.
Lẹhin eyi, awọn apejuwe faili ti nọmba 3 ati 4 tun wa ni pipade ni awọn ilana ọmọde, nitori wọn ko lo wọn mọ.
Mo mọọmọ foju foju asọye faili 255; o jẹ lilo fun awọn idi inu nipasẹ bash funrararẹ ati pe yoo tun wa ni pipade ni awọn ilana ọmọde.
Nigbamii, ni ilana ọmọ akọkọ pẹlu PID 9004, bash bẹrẹ lilo ipe eto kan
Ninu ilana ọmọ keji pẹlu PID 9005, bash nṣiṣẹ iṣẹ ṣiṣe keji ti a pato, ninu ọran wa / usr / bin / orun.
Ipe eto exec ko pa awọn imudani faili ayafi ti wọn ba ṣii pẹlu asia O_CLOEXEC ni akoko ti ipe ṣiṣi silẹ. Ninu ọran wa, lẹhin ifilọlẹ awọn faili ti o ṣiṣẹ, gbogbo awọn apejuwe faili lọwọlọwọ yoo wa ni fipamọ.
Ṣayẹwo inu console:
[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
Bii o ti le rii, nọmba alailẹgbẹ ti paipu wa jẹ kanna ni awọn ilana mejeeji. Nitorinaa a ni asopọ laarin awọn ilana oriṣiriṣi meji pẹlu obi kanna.
Fun awọn ti ko faramọ pẹlu awọn ipe eto ti bash nlo, Mo ṣeduro gaan ṣiṣe awọn aṣẹ nipasẹ strace ati wiwo ohun ti n ṣẹlẹ ni inu, fun apẹẹrẹ bii eyi:
strace -s 1024 -f bash -c "ls | grep hello"
Jẹ ki a pada si iṣoro wa pẹlu aaye disk kekere ati igbiyanju lati ṣafipamọ data laisi tun ilana naa bẹrẹ. Jẹ ki a kọ eto kekere kan ti yoo kọ to 1 megabyte fun iṣẹju kan si disk. Pẹlupẹlu, ti o ba jẹ fun idi kan a ko lagbara lati kọ data si disk, a yoo foju foju kọ eyi ki a gbiyanju lati kọ data lẹẹkansi ni iṣẹju-aaya kan. Ninu apẹẹrẹ ti Mo nlo Python, o le lo eyikeyi ede siseto miiran.
[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
Jẹ ki a ṣiṣẹ eto naa ki o wo awọn apejuwe faili
[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
Bii o ti le rii, a ni awọn apejuwe faili boṣewa 3 wa ati ọkan diẹ sii ti a ṣii. Jẹ ki a ṣayẹwo iwọn faili naa:
[user@localhost ]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 117M Oct 7 16:30 123.txt
A ti kọ data naa, a gbiyanju lati yi awọn igbanilaaye pada lori faili naa:
[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
A rii pe a tun kọ data naa, botilẹjẹpe olumulo wa ko ni igbanilaaye lati kọ si faili naa. Jẹ ki a gbiyanju lati yọ kuro:
[user@localhost ]$ sudo rm 123.txt
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory
Nibo ni a ti kọ data naa? Ati pe a kọ wọn rara? A ṣayẹwo:
[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)
Bẹẹni, oluṣapejuwe faili wa ṣi wa ati pe a le tọju oluṣapejuwe faili yii bi faili atijọ wa, a le ka, ko o ati daakọ rẹ.
Jẹ ki a wo iwọn faili naa:
[user@localhost ]$ lsof | grep 123.txt
python 31083 user 3w REG 8,5 19923457 2621522 /home/user/123.txt
Iwọn faili naa jẹ 19923457. Jẹ ki a gbiyanju lati ko faili naa kuro:
[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
Bii o ti le rii, iwọn faili n pọ si nikan ati ẹhin mọto wa ko ṣiṣẹ. Jẹ ki a wo awọn iwe ipe eto
with open("123.txt", "w") as f:
a ni lati fi
with open("123.txt", "a") as f:
Ṣiṣayẹwo pẹlu asia “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
ati pẹlu asia "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
Siseto ilana ti nṣiṣẹ tẹlẹ
Nigbagbogbo awọn pirogirama, nigba ṣiṣẹda ati idanwo awọn eto, lo awọn olutọpa (fun apẹẹrẹ GDB) tabi awọn ipele pupọ ti gedu ninu ohun elo naa. Lainos n pese agbara lati kọ gangan ati yi eto ti nṣiṣẹ tẹlẹ pada, fun apẹẹrẹ, yi awọn iye ti awọn oniyipada pada, ṣeto aaye fifọ, ati bẹbẹ lọ, ati bẹbẹ lọ.
Pada si ibeere atilẹba nipa ko to aaye disk lati kọ faili kan, jẹ ki a gbiyanju lati ṣe adaṣe iṣoro naa.
Jẹ ki a ṣẹda faili kan fun ipin wa, eyiti a yoo gbe bi disk lọtọ:
[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 ~]$
Jẹ ki a ṣẹda eto faili kan:
[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 ~]$
Gbe eto faili naa:
[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
A ṣẹda itọsọna kan pẹlu oniwun wa:
[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs
Jẹ ki a ṣii faili fun kikọ nikan ninu eto wa:
with open("/mnt/logs/123.txt", "w") as f:
Ifilọlẹ
[user@localhost ]$ python openforwrite.py
A duro kan diẹ aaya
[user@localhost ~]$ df -h | grep mnt
/dev/loop0 8.7M 8.0M 0 100% /mnt
Nitorinaa, a ni iṣoro ti a ṣalaye ni ibẹrẹ nkan yii. Aaye ọfẹ 0, 100% ti tẹdo.
A ranti pe ni ibamu si awọn ipo ti iṣẹ-ṣiṣe, a n gbiyanju lati ṣe igbasilẹ data pataki ti ko le padanu. Ati ni akoko kanna, a nilo lati ṣatunṣe iṣẹ naa laisi tun bẹrẹ ilana naa.
Jẹ ki a sọ pe a tun ni aaye disk, ṣugbọn ni ipin ti o yatọ, fun apẹẹrẹ ni / ile.
Jẹ ká gbiyanju lati "reprogram lori awọn fly" wa koodu.
Jẹ ki a wo PID ti ilana wa, eyiti o jẹ gbogbo aaye disk:
[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
Sopọ si ilana nipasẹ gdb
[user@localhost ~]$ gdb -p 10078
...
(gdb)
Jẹ ki a wo awọn apejuwe faili ṣiṣi:
(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
A wo alaye nipa nọmba oluṣapejuwe faili 3, eyiti o nifẹ si wa
(gdb) shell cat /proc/10078/fdinfo/3
pos: 8189952
flags: 0100001
mnt_id: 482
Ni lokan ohun ti eto ti a npe ni Python ṣe (wo loke ibi ti a ti ran strace ati ki o ri awọn ìmọ ipe), nigba ti a ba ṣiṣẹ koodu wa lati ṣii faili, a ṣe kanna fun ara wa fun ilana wa, sugbon a nilo awọn O_WRONLY|O_CREAT| O_TRUNC die-die ropo pẹlu kan nomba iye. Lati ṣe eyi, ṣii awọn orisun kernel, fun apẹẹrẹ
# setumo O_WRONLY 00000001
# setumo O_CREAT 00000100
# asọye O_TRUNC 00001000
A darapọ gbogbo awọn iye sinu ọkan, a gba 00001101
A nṣiṣẹ ipe wa lati gdb
(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4
Nitorinaa a ni apejuwe faili tuntun pẹlu nọmba 4 ati faili ṣiṣi tuntun lori ipin miiran, a ṣayẹwo:
(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
A ranti apẹẹrẹ pẹlu paipu - bawo ni bash ṣe yipada awọn apejuwe faili, ati pe a ti kọ tẹlẹ ipe eto dup2.
A gbiyanju lati ropo ọkan faili apejuwe pẹlu miiran
(gdb) call dup2(4,3)
$2 = 3
A ṣayẹwo:
(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
A pa apejuwe faili 4, nitori a ko nilo rẹ:
(gdb) call close (4)
$1 = 0
Ati ki o jade 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
Ṣiṣayẹwo faili tuntun:
[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
Bii o ti le rii, data ti kọ si faili tuntun, jẹ ki a ṣayẹwo ti atijọ:
[user@localhost ~]$ ls -lah /mnt/logs/123.txt
-rw-rw-r-- 1 user user 7.9M Oct 8 11:08 /mnt/logs/123.txt
Ko si data ti o sọnu, ohun elo naa n ṣiṣẹ, awọn akọọlẹ ti kọ si ipo tuntun.
Jẹ ki ká complicate awọn iṣẹ-ṣiṣe kekere kan
Jẹ ki a fojuinu pe data naa ṣe pataki fun wa, ṣugbọn a ko ni aaye disk ni eyikeyi awọn ipin ati pe a ko le sopọ disk naa.
Ohun ti a le ṣe ni atunṣe data wa ni ibikan, fun apẹẹrẹ si paipu, ati ni titan darí data lati paipu si nẹtiwọki nipasẹ diẹ ninu awọn eto, fun apẹẹrẹ netcat.
A le ṣẹda paipu ti a npè ni pẹlu aṣẹ mkfifo. Yoo ṣẹda faili pseudo kan lori eto faili paapaa ti ko ba si aaye ọfẹ lori rẹ.
Tun ohun elo naa bẹrẹ ki o ṣayẹwo:
[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
Ko si aaye disk, ṣugbọn a ṣaṣeyọri ṣẹda paipu ti a darukọ nibẹ:
[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
Bayi a nilo lati fi ipari si gbogbo data ti o lọ sinu paipu yii si olupin miiran nipasẹ nẹtiwọọki; netcat kanna dara fun eyi.
Lori olupin remote-server.example.com a ṣe ifilọlẹ
[user@localhost ~]$ nc -l 7777 > 123.txt
Lori olupin iṣoro wa a ṣe ifilọlẹ ni ebute lọtọ
[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe
Bayi gbogbo data ti o pari ni paipu yoo lọ laifọwọyi si stdin ni netcat, eyiti yoo firanṣẹ si nẹtiwọki lori ibudo 7777.
Gbogbo ohun ti a ni lati ṣe ni bẹrẹ kikọ data wa sinu paipu ti a npè ni yii.
A ti ni ohun elo ti nṣiṣẹ tẹlẹ:
[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
Ninu gbogbo awọn asia, a nilo O_WRONLY nikan niwọn igba ti faili ti wa tẹlẹ ati pe a ko nilo lati nu kuro
[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
Ṣiṣayẹwo olupin latọna jijin remote-server.example.com
[user@localhost ~]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 38M Oct 8 14:21 123.txt
Awọn data ti wa ni bọ, a ṣayẹwo awọn isoro olupin
[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
Awọn data ti wa ni fipamọ, awọn isoro ti wa ni re.
Mo fi asiko yi ki awon elegbe mi lati Degiro.
Tẹtisi awọn adarọ-ese Redio-T.
Gbogbo ire.
Gẹgẹbi iṣẹ amurele, Mo daba pe ki o ronu nipa kini yoo wa ninu awọn asọye faili ilana ologbo ati oorun ti o ba ṣiṣẹ aṣẹ wọnyi:
[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000
orisun: www.habr.com