Uair amháin, le linn agallaimh, fiafraíodh díom, cad a dhéanfaidh tú má aimsíonn tú seirbhís nach bhfuil ag obair toisc go bhfuil an diosca imithe as an spás?
Ar ndóigh, d'fhreagair mé go bhfeicfinn cad a bhí áitithe ag an áit seo agus, más féidir, go nglanfainn an áit.
Ansin d'fhiafraigh an t-agallóir, cad a tharlóidh mura bhfuil spás saor in aisce ar an gcríochdheighilt, ach nach bhfeiceann tú freisin aon chomhaid a thógfadh an spás ar fad?
Chuige seo dúirt mé gur féidir leat breathnú i gcónaí ar thuairisceoirí comhaid oscailte, mar shampla leis an ordú lsof, agus a thuiscint cén feidhmchlár a ghlac an spás go léir atá ar fáil, agus ansin is féidir leat gníomhú de réir na gcúinsí, ag brath ar cibé an bhfuil gá leis na sonraí .
Chuir an t-agallóir isteach orm ar an bhfocal deiridh, ag cur lena cheist: “Ceaptha nach bhfuil na sonraí de dhíth orainn, níl ann ach logáil dífhabhtaithe, ach ní oibríonn an feidhmchlár mar ní féidir leis dífhabhtú a scríobh”?
“Ceart go leor,” a d’fhreagair mé, “is féidir linn dífhabhtú a mhúchadh i gcumraíocht an fheidhmchláir agus é a atosú.”
Chuir an t-agallóir ina aghaidh: “Ní féidir, ní féidir linn an feidhmchlár a atosú, tá sonraí tábhachtacha stóráilte againn fós sa chuimhne, agus tá cliaint thábhachtacha ceangailte leis an tseirbhís féin, rud nach féidir linn iallach a chur uirthi athcheangal arís.”
“ceart go leor,” a dúirt mé, “mura féidir linn an feidhmchlár a atosú agus nach bhfuil na sonraí tábhachtach dúinn, is féidir linn an comhad oscailte seo a ghlanadh go simplí trí thuairisceoir an chomhaid, fiú mura bhfeicimid é san ordú ls ar an gcóras comhad.”
Bhí an t-agallóir sásta, ach ní raibh mé.
Ansin shíl mé, cén fáth nach ndéanann an duine atá ag tástáil m'eolais tochailt níos doimhne? Ach cad má tá na sonraí tábhachtach tar éis an tsaoil? Cad a tharlóidh mura féidir linn próiseas a atosú, agus go scríobhann an próiseas chuig an gcóras comhad ar dheighilt nach bhfuil spás saor in aisce ann? Cad a tharlóidh mura féidir linn ní hamháin na sonraí atá scríofa cheana féin a chailleadh, ach freisin na sonraí a scríobhann an próiseas seo nó a dhéanann iarracht a scríobh?
Tuzik
Go luath i mo ghairm bheatha, rinne mé iarracht feidhmchlár beag a chruthú a raibh gá le faisnéis úsáideora a stóráil. Agus ansin shíl mé, conas is féidir liom an t-úsáideoir a mheaitseáil lena shonraí. Mar shampla, tá Ivanov Ivan Ivanovich agam, agus tá roinnt faisnéise aige, ach conas is féidir liom cairde a dhéanamh leo? Is féidir liom a chur in iúl go díreach go mbaineann an madra darb ainm "Tuzik" leis an Ivan seo. Ach cad a tharlóidh má athraíonn sé a ainm agus ina ionad sin go dtiocfaidh Ivan, mar shampla, Olya? Ansin beidh sé amach nach mbeidh madra ag ár Olya Ivanovna Ivanova a thuilleadh, agus beidh ár Tuzik fós ina bhall den Ivan nach bhfuil ann. Chuidigh bunachar sonraí a thug aitheantóir uathúil (ID) do gach úsáideoir an fhadhb seo a réiteach, agus bhí mo Tuzik ceangailte leis an ID seo, nach raibh ann ach sraithuimhir. Mar sin, bhí uimhir aitheantais 2 ag úinéir an Ace, agus ag am éigin bhí Ivan faoin ID seo, agus ansin tháinig Olya faoin ID céanna. Réitíodh fadhb na daonnachta agus feirmeoireachta ainmhithe go praiticiúil.
Tuairisceoir comhaid
Tá fadhb an chomhaid agus an chláir a oibríonn leis an gcomhad seo thart ar an gcéanna agus atá ag ár madra agus ár bhfear. Cuir i gcás d’oscail mé comhad darb ainm ivan.txt agus thosaigh mé ag scríobh an fhocail tuzik isteach ann, ach níor éirigh liom ach an chéad litir “t” a scríobh sa chomhad, agus d’athainmnigh duine éigin an comhad seo, mar shampla, go olya.txt. Ach tá an comhad mar an gcéanna, agus fós ba mhaith liom a thaifeadadh mo ace ann. Gach uair a osclaítear comhad trí ghlao córais
In Linux, osclaíonn leabharlann libc 3 chomhad tuairisceora do gach feidhmchlár reatha (próiseas), uimhrithe 0,1,2. Is féidir tuilleadh eolais a fháil ar na naisc
- Tugtar STDIN ar thuairisceoir comhaid 0 agus baineann sé le hionchur feidhmchláir
- STDOUT a thugtar ar thuairisceoir comhaid 1 agus úsáideann feidhmchláir é chun sonraí a aschur, mar orduithe priontála
- Tugtar STDERR ar thuairisceoir comhaid 2 agus úsáideann feidhmchláir é chun teachtaireachtaí earráide a aschur.
Má osclaíonn tú comhad ar bith le léamh nó le scríobh i do chlár, is dóichí go bhfaighidh tú an chéad ID saor in aisce agus is é uimhir 3 a bheidh ann.
Is féidir liosta na dtuairisceoirí comhaid a fheiceáil le haghaidh aon phróisis má tá a PID ar eolas agat.
Mar shampla, déanaimis an consól bash a oscailt agus breathnú ar PID ár bpróiseas
[user@localhost ]$ echo $$
15771
Sa dara consól a ligean ar siúl
[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
Is féidir neamhaird a dhéanamh go sábháilte ar thuairisceoir comhaid uimhir 255 chun críocha an ailt seo; d’oscail bash féin é dá riachtanais, agus ní ag an leabharlann nasctha.
Anois tá baint ag na 3 chomhad tuairisceora go léir leis an bhfeiste teirminéil bréige
[user@localhost ]$ echo "hello world" > /proc/15771/fd/0
Agus sa chéad consól feicfimid
[user@localhost ]$ hello world
Atreorú agus Píobán
Is féidir leat na 3 chomhad tuairisceora seo a shárú go héasca in aon phróiseas, lena n-áirítear i bash, mar shampla trí phíobán a nascann dhá phróiseas, féach
[user@localhost ]$ cat /dev/zero | sleep 10000
Is féidir leat an t-ordú seo a rith tú féin le stríoc -f agus féach cad atá ar siúl istigh, ach inseoidh mé duit go hachomair.
Déanann ár bpróiseas bash tuismitheora le PID 15771 ár n-ordú a pharsáil agus tuigeann sé go díreach cé mhéad orduithe a theastaíonn uainn a rith, inár gcás tá dhá cheann acu: cat agus codladh. Tá a fhios ag Bash go gcaithfidh sé dhá phróiseas leanbh a chruthú, agus iad a chumasc i bpíobán amháin. San iomlán, beidh 2 phróiseas linbh agus píopa amháin ag teastáil ó bash.
Ritheann Bash glao córais sula gcruthaítear próisis leanaí
Maidir leis an bpróiseas tuismitheora, is cosúil go bhfuil píopa ann cheana féin, ach níl aon phróisis leanaí ann fós:
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
Ansin ag baint úsáide as an gcóras glaoch
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
Ná déan dearmad go gcloíonn clón an próiseas mar aon le gach tuairisceoir comhaid, mar sin beidh siad mar an gcéanna sa phróiseas tuismitheora agus sna cinn linbh. Is é post an phróisis tuismitheora le PID 15771 ná monatóireacht a dhéanamh ar phróisis an linbh, mar sin ní bhíonn ach fanacht ar fhreagra ó na leanaí.
Mar sin, ní gá píopa a bheith ann, agus dúnann sé tuairisceoirí comhaid 3 agus 4.
Sa chéad phróiseas bash leanaí le PID 9004, glao an chórais
Sa dara próiseas leanbh le PID 9005, úsáideann bash dup2 chun an tuairisceoir comhaid STDIN uimhir 0 a athrú. Anois léifear gach rud a léifidh ár dara bash le PID 9005 ón bpíopa.
Ina dhiaidh sin, déantar tuairisceoirí comhaid 3 agus 4 a dhúnadh freisin i bpróisis an linbh, ós rud é nach n-úsáidtear iad a thuilleadh.
Déanaim neamhaird d’aon ghnó ar thuairisceoir comhaid 255; úsáideann bash féin é chun críocha inmheánacha agus dúnfar é freisin i bpróisis leanaí.
Ansin, sa chéad phróiseas linbh le PID 9004, tosaíonn bash ag baint úsáide as glao córais
Sa dara próiseas linbh le PID 9005, ritheann bash an dara inrite a shonraigh muid, inár gcás /usr/bin/codladh.
Ní dhúnann glao an chórais exec na láimhseálacha comhad murar osclaíodh iad leis an mbratach O_CLOEXEC ag an am a rinneadh an glao oscailte. Is é ár gcás, tar éis na comhaid inrite a sheoladh, sábhálfar gach tuairisceoir comhaid reatha.
Seiceáil sa chonsól:
[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
Mar a fheiceann tú, tá líon uathúil ár bpíobáin mar an gcéanna sa dá phróiseas. Mar sin tá ceangal againn idir dhá phróiseas éagsúla leis an tuismitheoir céanna.
Dóibh siúd nach bhfuil eolach ar na glaonna córais a úsáideann bash, molaim go mór na horduithe a rith trí strace agus féachaint cad atá ag tarlú go hinmheánach, mar shampla mar seo:
strace -s 1024 -f bash -c "ls | grep hello"
Fillfimid ar ár bhfadhb le spás diosca íseal agus ag iarraidh sonraí a shábháil gan an próiseas a atosú. Scríobhfaimid clár beag a scríobhfaidh thart ar 1 meigibheart in aghaidh an tsoicind ar diosca. Ina theannta sin, más rud é ar chúis éigin nach raibh muid in ann sonraí a scríobh ar an diosca, beidh muid ag neamhaird seo go simplí agus iarracht a scríobh na sonraí arís i soicind. Sa sampla atá á úsáid agam Python, is féidir leat aon teanga cláir eile a úsáid.
[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
Déanaimis an clár a rith agus féachaint ar na tuairisceoirí comhaid
[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
Mar a fheiceann tú, tá ár 3 thuairisceoir caighdeánach comhaid againn agus ceann eile a d'oscail muid. Déanaimis méid an chomhaid a sheiceáil:
[user@localhost ]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 117M Oct 7 16:30 123.txt
Tá na sonraí á scríobh, déanaimid iarracht na ceadanna ar an gcomhad a athrú:
[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
Feicimid go bhfuil na sonraí fós á scríobh, cé nach bhfuil cead ag ár n-úsáideoir scríobh chuig an gcomhad. Déanaimis iarracht é a bhaint:
[user@localhost ]$ sudo rm 123.txt
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory
Cá bhfuil na sonraí scríofa? Agus an bhfuil siad scríofa ar chor ar bith? Déanaimid seiceáil:
[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)
Sea, tá ár dtuairisceoir comhaid fós ann agus is féidir linn caitheamh leis an tuairisceoir comhaid seo mar ár seanchomhad, is féidir linn é a léamh, a ghlanadh agus a chóipeáil.
Breathnaímid ar mhéid an chomhaid:
[user@localhost ]$ lsof | grep 123.txt
python 31083 user 3w REG 8,5 19923457 2621522 /home/user/123.txt
Méid an chomhaid ná 19923457. Déanaimis iarracht an comhad a ghlanadh:
[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
Mar a fheiceann tú, níl ach méadú ar mhéid an chomhaid agus níor oibrigh ár trunk. Breathnaímid ar dhoiciméadú glaonna an chórais
with open("123.txt", "w") as f:
caithfimid a chur
with open("123.txt", "a") as f:
Seiceáil leis an mbratach “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
agus leis an bratach "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
Próiseas atá ar siúl cheana féin a ríomhchlárú
Is minic a úsáideann ríomhchláraitheoirí agus iad ag cruthú agus ag tástáil cláir, dífhabhtóirí (mar shampla GDB) nó leibhéil éagsúla logáil isteach san fheidhmchlár. Soláthraíonn Linux an cumas clár atá ag rith cheana féin a scríobh agus a athrú, mar shampla, luachanna na n-athróg a athrú, briseadhphointe a shocrú, etc., etc.
Ag filleadh ar an gceist bhunaidh faoi easpa spáis diosca chun comhad a scríobh, déanaimis iarracht an fhadhb a insamhail.
Cruthaímid comhad dár críochdheighilt, a chuirfimid suas mar dhiosca ar leith:
[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 ~]$
Cruthaimis córas comhaid:
[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 ~]$
Suiteáil an córas comhaid:
[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
Cruthaímid eolaire lenár n-úinéir:
[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs
Osclaímid an comhad lena scríobh inár gclár amháin:
with open("/mnt/logs/123.txt", "w") as f:
Seoladh
[user@localhost ]$ python openforwrite.py
Táimid ag fanacht cúpla soicind
[user@localhost ~]$ df -h | grep mnt
/dev/loop0 8.7M 8.0M 0 100% /mnt
Mar sin, ní mór dúinn an fhadhb a thuairiscítear ag tús an ailt seo. Spás saor in aisce 0, 100% áitithe.
Cuimhnímid, de réir choinníollacha an taisc, go bhfuilimid ag iarraidh sonraí an-tábhachtacha nach féidir a chailleadh a thaifeadadh. Agus ag an am céanna, ní mór dúinn an tseirbhís a shocrú gan an próiseas a atosú.
Ligean le rá go bhfuil spás diosca fós againn, ach i ndeighilt eile, mar shampla sa bhaile / sa bhaile.
Déanaimis iarracht ár gcód a “athchlárú ar an eitilt”.
Breathnaímid ar PID ár bpróiseas, a d'ith suas an spás diosca go léir:
[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
Ceangail leis an bpróiseas trí gdb
[user@localhost ~]$ gdb -p 10078
...
(gdb)
Breathnaímid ar na tuairisceoirí comhaid oscailte:
(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
Breathnaímid ar an bhfaisnéis faoi thuairisceoir comhad uimhir 3, rud a bhfuil spéis againn ann
(gdb) shell cat /proc/10078/fdinfo/3
pos: 8189952
flags: 0100001
mnt_id: 482
Ag cuimhneamh ar an nglao córais a dhéanann Python (féach thuas áit ar ritheamar gan stró agus ar aimsigh muid an glao oscailte), agus ár gcód á phróiseáil againn chun comhad a oscailt, déanaimid an rud céanna ar son ár bpróiseas, ach tá an O_WRONLY|O_CREAT| Cuirtear luach uimhriúil in ionad giotán O_TRUNC. Chun seo a dhéanamh, oscail na foinsí eithne, mar shampla
#sainmhíniú O_WRONLY 00000001
#define O_CREAT 00000100
#sainmhíniú O_TRUNC 00001000
Le chéile againn na luachanna go léir i amháin, a fháil againn 00001101
Ritheann muid ár nglao ó gdb
(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4
Mar sin fuaireamar tuairisceoir comhaid nua le huimhir 4 agus comhad oscailte nua ar dheighilt eile, seiceálann muid:
(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
Cuimhnímid ar an sampla le píopa - conas a athraíonn bash tuairisceoirí comhaid, agus tá glao an chórais dup2 foghlamtha againn cheana féin.
Déanaimid iarracht tuairisceoir comhaid amháin a athsholáthar le ceann eile
(gdb) call dup2(4,3)
$2 = 3
Déanaimid seiceáil:
(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
Dúnaimid tuairisceoir comhaid 4, ós rud é nach bhfuil sé ag teastáil uainn:
(gdb) call close (4)
$1 = 0
Agus scoir 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
Ag seiceáil an chomhaid nua:
[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
Mar a fheiceann tú, tá na sonraí scríofa chuig comhad nua, seiceáil an seancheann:
[user@localhost ~]$ ls -lah /mnt/logs/123.txt
-rw-rw-r-- 1 user user 7.9M Oct 8 11:08 /mnt/logs/123.txt
Ní chailltear aon sonraí, oibríonn an feidhmchlár, scríobhtar logaí chuig suíomh nua.
Déanaimis an tasc beagán casta
Samhlóimid go bhfuil na sonraí tábhachtach dúinn, ach níl spás diosca againn in aon cheann de na deighiltí agus ní féidir linn an diosca a nascadh.
Is é an rud is féidir linn a dhéanamh ná ár sonraí a atreorú áit éigin, mar shampla chuig píopa, agus ina dhiaidh sin sonraí a atreorú ón bpíobán go dtí an líonra trí chlár éigin, mar shampla netcat.
Is féidir linn píopa ainmnithe a chruthú leis an ordú mkfifo. Cruthóidh sé comhad bréige ar an gcóras comhad fiú mura bhfuil spás saor in aisce air.
Atosaigh an feidhmchlár agus seiceáil:
[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
Níl aon spás diosca ann, ach d'éirigh linn píopa ainmnithe a chruthú ann:
[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
Anois caithfimid na sonraí go léir a théann isteach sa phíobán seo a fhilleadh ar fhreastalaí eile tríd an líonra; tá an líonra céanna oiriúnach dó seo.
Ar an gcianfhreastalaí-server.example.com a rithimid
[user@localhost ~]$ nc -l 7777 > 123.txt
Ar ár bhfreastalaí fadhbach seolaimid i teirminéal ar leith
[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe
Anois rachaidh na sonraí go léir a chríochnaíonn sa phíobán go huathoibríoch chuig stdin in netcat, a sheolfaidh chuig an líonra ar phort 7777 é.
Níl le déanamh againn ach ár sonraí a scríobh isteach sa phíobán ainmnithe seo.
Tá an feidhmchlár á rith againn cheana féin:
[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
As na bratacha ar fad, níl de dhíth orainn ach O_WRONLY ós rud é go bhfuil an comhad ann cheana agus ní gá dúinn é a ghlanadh
[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
Seiceáil an cianfhreastalaí cianda-server.example.com
[user@localhost ~]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 38M Oct 8 14:21 123.txt
Tá na sonraí ag teacht, déanaimid seiceáil ar an bhfreastalaí fadhb
[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
Tá na sonraí a shábháil, tá an fhadhb a réiteach.
Glacaim an deis seo chun Dia duit a rá le mo chomhghleacaithe ó Degiro.
Éist le podchraoltaí Raidió-T.
Maith thú go léir.
Mar obair bhaile, molaim duit smaoineamh ar cad a bheidh sa tuairisceoirí comhaid próisis cat agus codladh má ritheann tú an t-ordú seo a leanas:
[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000
Foinse: will.com