Tuairisceoir comhaid i Linux le samplaí

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 oscailt in aon teanga ríomhchlárúcháin faighim ID uathúil a díríonn mé ar chomhad, is é an t-aitheantas seo an tuairisceoir comhaid. Agus is cuma ar chor ar bith cad a dhéanann agus cé a dhéanann leis an gcomhad seo ina dhiaidh sin, is féidir é a scriosadh, is féidir é a athainmniú, is féidir an t-úinéir a athrú, nó is féidir na cearta léamh agus scríobh a bhaint, beidh rochtain agam fós dó, mar nuair a bhí an comhad á oscailt, bhí na cearta agam é a léamh agus/nó a scríobh agus d’éirigh liom tosú ag obair leis, rud a chiallaíonn go gcaithfidh mé leanúint ar aghaidh ag déanamh amhlaidh.

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 stdio fear и stdout fear

  • 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 /dev/pts, ach is féidir linn iad a ionramháil fós, mar shampla, iad a reáchtáil i dara consól

[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í píopa agus faigheann sé tuairisceoirí comhaid nua ar an maolán píopa sealadach, ach ní nascann an maolán seo ár bpróiseas dhá leanbh fós.

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 Clón cruthaíonn bash dhá phróiseas linbh, agus beidh ár dtrí phróiseas cuma mar seo:

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 dup2, athraíonn ár dtuairisceoir comhad STDOUT uimhir 1 go dtí tuairisceoir comhaid atá dírithe ar phíobán, inár gcás is é uimhir 3. Mar sin, críochnóidh gach rud a scríobhann an chéad phróiseas leanbh le PID 9004 chuig STDOUT go huathoibríoch sa mhaolán píopa.

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 exec an comhad inrite a shonraigh muid ar an líne ordaithe, is é /usr/bin/cat inár gcás.

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 oscailt. Má úsáidimid an bhratach O_APPEND agus comhad á oscailt, ansin le gach scríobh, seiceálann an córas oibriúcháin méid an chomhaid agus scríobhann sé sonraí go dtí deireadh an chomhaid, agus déanann sé seo go adamhach. Ligeann sé seo do shnáitheanna nó próisis iolracha scríobh chuig an gcomhad céanna. Ach inár gcód ní úsáidimid an bhratach seo. Ní féidir linn méid comhaid difriúil a fheiceáil i lsof after trunk ach amháin má osclaíonn muid an comhad le haghaidh scríbhneoireachta breise, rud a chiallaíonn inár gcód ina ionad sin

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 anseo agus féachaint ar na bratacha atá freagrach as cad

#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

Add a comment