Tuairisgeul faidhle ann an Linux le eisimpleirean

Aon uair, rè agallamh, chaidh faighneachd dhomh, dè a nì thu ma lorgas tu seirbheis nach eil ag obair leis gu bheil an diosc air ruith a-mach à àite?

Gun teagamh, fhreagair mi gun chitheadh ​​​​mi na bha air a chleachdadh san àite seo agus, nam biodh e comasach, glanaidh mi an t-àite.
An uairsin dh’ fhaighnich an neach-agallaimh, dè mura h-eil àite an-asgaidh air a’ phàirteachadh, ach nach fhaic thu faidhlichean sam bith a bheireadh an àite gu lèir?

Gus seo thuirt mi gum faod thu an-còmhnaidh coimhead air tuairisgeulan faidhle fosgailte, mar eisimpleir leis an àithne lsof, agus tuigsinn dè an tagradh a tha air gabhail ris a h-uile àite a tha ri fhaighinn, agus an uairsin faodaidh tu obrachadh a rèir an t-suidheachaidh, a rèir a bheil feum air an dàta .

Chuir an neach-agallaimh stad orm air an fhacal mu dheireadh, a’ cur ris a’ cheist aige: “Abair nach eil feum againn air an dàta, is e dìreach log deasbaid a th’ ann, ach chan eil an tagradh ag obair leis nach urrainn dha deasbaid a sgrìobhadh ”?

“Ceart gu leòr,” fhreagair mi, “is urrainn dhuinn debug a chuir dheth ann an rèiteachadh an tagraidh agus ath-thòiseachadh.”
Chuir an neach-agallaimh an aghaidh: “Chan e, chan urrainn dhuinn an tagradh ath-thòiseachadh, tha dàta cudromach againn fhathast air a stòradh mar chuimhneachan, agus tha teachdaichean cudromach ceangailte ris an t-seirbheis fhèin, nach urrainn dhuinn toirt air ath-cheangal a-rithist.”

“Ceart gu leòr,” thuirt mi, “mura h-urrainn dhuinn an tagradh ath-thòiseachadh agus nach eil an dàta cudromach dhuinn, is urrainn dhuinn dìreach am faidhle fosgailte seo a ghlanadh tro thuairisgeul an fhaidhle, eadhon ged nach fhaic sinn e san àithne ls air an t-siostam faidhle.”

Bha an neach-agallaimh toilichte, ach cha robh mi.

An uairsin smaoinich mi, carson nach eil an neach a tha a’ dèanamh deuchainn air m ’eòlas a’ cladhach nas doimhne? Ach dè ma tha an dàta cudromach às deidh a h-uile càil? Dè mura h-urrainn dhuinn pròiseas ath-thòiseachadh, agus am pròiseas a’ sgrìobhadh chun t-siostam faidhle air sgaradh aig nach eil àite an-asgaidh? Dè mura h-urrainn dhuinn a bhith a 'call chan e a-mhàin an dàta a chaidh a sgrìobhadh mu thràth, ach cuideachd an dàta a tha am pròiseas seo a' sgrìobhadh no a 'feuchainn ri sgrìobhadh?

Tusic

Tràth nam dhreuchd, dh'fheuch mi ri aplacaid bheag a chruthachadh a dh'fheumadh fiosrachadh luchd-cleachdaidh a stòradh. Agus an uairsin smaoinich mi, ciamar as urrainn dhomh an neach-cleachdaidh a mhaidseadh ris an dàta aige. Mar eisimpleir, tha Ivanov Ivan Ivanovich agam, agus tha beagan fiosrachaidh aige, ach ciamar as urrainn dhomh caraidean a dhèanamh leotha? Is urrainn dhomh a chomharrachadh gu dìreach gur ann leis an fhìor Ivan seo a tha an cù leis an t-ainm “Tuzik”. Ach dè ma dh'atharraicheas e ainm agus an àite Ivan, mar eisimpleir, Olya? An uairsin tionndaidhidh e a-mach nach bi cù aig ar Olya Ivanovna Ivanova tuilleadh, agus buinidh ar Tuzik fhathast don Ivan nach eil ann. Chuidich stòr-dàta a thug aithnichear sònraichte (ID) do gach neach-cleachdaidh an duilgheadas seo fhuasgladh, agus bha mo Tuzik ceangailte ris an ID seo, a bha, gu dearbh, dìreach na àireamh sreathach. Mar sin, bha ID àireamh 2 aig sealbhadair an ace, agus aig àm air choreigin bha Ivan fon ID seo, agus an uairsin thàinig Olya fon aon ID. Chaidh duilgheadas daonnachd agus tuathanachas bheathaichean fhuasgladh gu practaigeach.

Tuairisgeul an fhaidhle

Tha duilgheadas an fhaidhle agus am prògram a tha ag obair leis an fhaidhle seo timcheall air an aon rud ris a’ chù agus an duine againn. Osbarr dh’ fhosgail mi faidhle leis an t-ainm ivan.txt agus thòisich mi a’ sgrìobhadh am facal tuzik a-steach ann, ach cha do shoirbhich leam ach a’ chiad litir “t” a sgrìobhadh san fhaidhle, agus chaidh am faidhle seo ath-ainmeachadh le cuideigin, mar eisimpleir, gu olya.txt. Ach tha am faidhle mar a tha e, agus tha mi fhathast airson mo ace a chlàradh ann. Gach uair a thèid faidhle fhosgladh le gairm siostam fosgailte ann an cànan prògramadh sam bith gheibh mi ID sònraichte a tha gam chomharrachadh gu faidhle, is e an ID seo an tuairisgeul faidhle. Agus chan eil e gu diofar dè agus cò a nì leis an fhaidhle seo an ath rud, faodar a sguabadh às, faodar ath-ainmeachadh, faodar an sealbhadair atharrachadh, no faodar na còraichean leughaidh is sgrìobhaidh a thoirt air falbh, bidh cothrom agam fhathast dha, oir aig àm fosgladh am faidhle, bha na còraichean agam a leughadh agus/no a sgrìobhadh agus fhuair mi air tòiseachadh ag obair leis, agus tha sin a’ ciallachadh gum feum mi cumail a’ dèanamh sin.

Ann an Linux, bidh leabharlann libc a’ fosgladh 3 faidhlichean tuairisgeul airson gach tagradh ruith (pròiseas), le àireamh 0,1,2. Gheibhear barrachd fiosrachaidh air na ceanglaichean fear stdio и fear sgith

  • Canar STDIN ri tuairisgeul faidhle 0 agus tha e co-cheangailte ri cuir a-steach tagraidh
  • Canar STDOUT ri tuairisgeul faidhle 1 agus tha e air a chleachdadh le tagraidhean gus dàta a thoirt a-mach, leithid òrdughan clò-bhualaidh
  • Canar STDERR ri tuairisgeul faidhle 2 agus tha e air a chleachdadh le tagraidhean gus teachdaireachdan mearachd a chuir a-mach.

Ma dh’ fhosglas tu sa phrògram agad faidhle sam bith airson a leughadh no a sgrìobhadh, is coltaiche gum faigh thu a’ chiad ID an-asgaidh agus is e àireamh 3 a bhios ann.

Faodar an liosta de thuairisgeulan faidhle fhaicinn airson pròiseas sam bith ma tha thu eòlach air a PID.

Mar eisimpleir, fosgail sinn an consol bash agus coimhead air PID ar pròiseas

[user@localhost ]$ echo $$
15771

Anns an dàrna consol leig leinn ruith

[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

Faodaidh tu dearmad a dhèanamh gu sàbhailte air tuairisgeul faidhle àireamh 255 airson adhbharan an artaigil seo; chaidh fhosgladh airson a fheumalachdan le bash fhèin, agus chan ann leis an leabharlann ceangailte.

A-nis tha na faidhlichean tuairisgeul 3 uile co-cheangailte ris an inneal crìochnachaidh pseudo /dev/pts, ach is urrainn dhuinn fhathast an làimhseachadh, mar eisimpleir, gan ruith ann an dàrna consol

[user@localhost ]$ echo "hello world" > /proc/15771/fd/0

Agus anns a 'chiad consol chì sinn

[user@localhost ]$ hello world

Ath-stiùireadh agus pìob

Is urrainn dhut na faidhlichean tuairisgeul 3 seo a thoirt thairis gu furasta ann am pròiseas sam bith, a’ gabhail a-steach ann am bash, mar eisimpleir tro phìob a’ ceangal dà phròiseas, faic

[user@localhost ]$ cat /dev/zero | sleep 10000

Faodaidh tu an àithne seo a ruith leat fhèin sreath -f agus faic ciod a tha dol a stigh, ach innsidh mi gu h-aithghearr dhuit.

Bidh ar pròiseas bash phàrant le PID 15771 a’ parsadh ar n-àithne agus a’ tuigsinn gu cinnteach cia mheud àithne a tha sinn airson a ruith, anns a’ chùis againn tha dhà dhiubh: cat is cadal. Tha fios aig Bash gum feum e dà phròiseas leanabh a chruthachadh, agus an cur còmhla ann an aon phìob. Gu h-iomlan, feumaidh bash 2 phròiseas leanabh agus aon phìob.

Bidh Bash a 'ruith gairm siostam mus cruthaichear pròiseasan leanabh pìoba agus a 'faighinn tuairisgeulan faidhle ùra air a' bhufair pìoba sealach, ach chan eil am bufair seo fhathast a 'ceangal ar pròiseasan dà leanabh.

Airson a 'phròiseas phàrant, tha e coltach gu bheil pìob ann mu thràth, ach chan eil pròiseasan cloinne ann fhathast:

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

An uairsin a 'cleachdadh a' ghairm siostam clone Bidh bash a’ cruthachadh dà phròiseas cloinne, agus seallaidh na trì pròiseasan againn 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

Na dì-chuimhnich gu bheil clone a 'clonadh a' phròiseas còmhla ris a h-uile tuairisgeul faidhle, agus mar sin bidh iad mar an ceudna anns a 'phròiseas phàrant agus anns a' chlann. Is e obair pròiseas pàrant le PID 15771 sùil a chumail air pròiseasan an leanaibh, agus mar sin tha e dìreach a’ feitheamh ri freagairt bhon chloinn.

Mar sin, chan eil feum air pìob, agus bidh e a’ dùnadh tuairisgeulan faidhle le àireamhan 3 agus 4.

Anns a 'chiad phròiseas bash leanabh le PID 9004, gairm an t-siostaim dup2, ag atharrachadh ar tuairisgeul faidhle STDOUT àireamh 1 gu tuairisgeul faidhle a tha a 'comharrachadh pìob, anns a' chùis againn is e àireamh 3. Mar sin, bidh a h-uile dad a sgrìobhas a 'chiad phròiseas leanabh le PID 9004 gu STDOUT a' tighinn gu crìch gu fèin-ghluasadach ann am bufair na pìoba.

Anns an dàrna pròiseas pàiste le PID 9005, bidh bash a 'cleachdadh dup2 gus an tuairisgeul faidhle àireamh STDIN 0 atharrachadh. A-nis thèid a h-uile dad a leughas an dàrna bash againn le PID 9005 a leughadh bhon phìob.

Às deidh seo, tha tuairisgeulan faidhle àireamh 3 agus 4 cuideachd dùinte ann am pròiseasan cloinne, leis nach eil iad air an cleachdadh tuilleadh.

Bidh mi a’ seachnadh tuairisgeul faidhle 255 a dh’aona ghnothach; tha e air a chleachdadh airson adhbharan a-staigh le bash fhèin agus bidh e dùinte cuideachd ann am pròiseasan cloinne.

An uairsin, anns a 'chiad phròiseas leanabh le PID 9004, bidh bash a' tòiseachadh a 'cleachdadh gairm siostam exec am faidhle so-ghnìomhaichte a shònraich sinn air an loidhne-àithne, anns a’ chùis againn is e /usr/bin/cat a th’ ann.

Anns an dàrna pròiseas pàiste le PID 9005, bidh bash a 'ruith an dàrna gnìomh a dh' ainmich sinn, nar cùis / usr / bin / cadal.

Cha bhith gairm an t-siostaim exec a’ dùnadh làmhan fhaidhlichean mura deach am fosgladh leis a’ bhratach O_CLOEXEC aig an àm a chaidh an gairm fhosgailte a dhèanamh. Anns a ’chùis againn, às deidh na faidhlichean so-ghnìomhaichte a chuir air bhog, thèid a h-uile tuairisgeul faidhle gnàthach a shàbhaladh.

Thoir sùil air a’ chonsail:

[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 chì thu, tha an àireamh àraid den phìob againn mar an ceudna anns an dà phròiseas. Mar sin tha ceangal againn eadar dà phròiseas eadar-dhealaichte leis an aon phàrant.

Dhaibhsan nach eil eòlach air na gairmean siostaim a bhios bash a’ cleachdadh, tha mi a’ moladh gu mòr na h-òrdughan a ruith tro strace agus faicinn dè tha a’ tachairt air an taobh a-staigh, mar eisimpleir mar seo:

strace -s 1024 -f bash -c "ls | grep hello"

Tillidh sinn chun duilgheadas againn le àite diosc ìosal agus feuchainn ri dàta a shàbhaladh gun a bhith ag ath-thòiseachadh a’ phròiseas. Sgrìobhamaid prògram beag a sgrìobhas mu 1 megabyte gach diog air diosc. A bharrachd air an sin, mura b’ urrainn dhuinn airson adhbhar air choireigin dàta a sgrìobhadh chun diosc, cha dèan sinn ach dearmad air seo agus feuchaidh sinn ris an dàta a sgrìobhadh a-rithist ann an diog. Anns an eisimpleir a tha mi a’ cleachdadh Python, faodaidh tu cànan prògramadh sam bith eile a chleachdadh.

[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

Leig leinn am prògram a ruith agus coimhead air na tuairisgeulan faidhle

[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 chì thu, tha na 3 tuairisgeulan faidhle àbhaisteach againn agus aon eile a dh’ fhosgail sinn. Feuch an dèan sinn sgrùdadh air meud an fhaidhle:

[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 117M Oct  7 16:30 123.txt

Tha an dàta ga sgrìobhadh, bidh sinn a’ feuchainn ris na ceadan air an fhaidhle atharrachadh:

[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

Chì sinn gu bheil an dàta fhathast ga sgrìobhadh, ged nach eil cead aig an neach-cleachdaidh againn sgrìobhadh chun fhaidhle. Feuchaidh sinn ris a thoirt air falbh:

[user@localhost ]$ sudo rm 123.txt 
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory

Càite a bheil an dàta sgrìobhte? Agus a bheil iad sgrìobhte idir? Nì sinn sgrùdadh:

[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)

Tha, tha an tuairisgeul faidhle againn fhathast ann agus is urrainn dhuinn an tuairisgeul faidhle seo a làimhseachadh mar an seann fhaidhle againn, is urrainn dhuinn a leughadh, a ghlanadh agus a chopaigeadh.

Bheir sinn sùil air meud an fhaidhle:

[user@localhost ]$ lsof | grep 123.txt
python    31083             user    3w      REG                8,5   19923457   2621522 /home/user/123.txt

'S e meud an fhaidhle 19923457. Feuchaidh sinn ris am faidhle 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 chì thu, chan eil meud an fhaidhle ach a’ dol am meud agus cha do dh’obraich ar stoc. Bheir sinn sùil air na sgrìobhainnean gairm siostam fosgailte. Ma chleachdas sinn a’ bhratach O_APPEND nuair a dh’fhosglas sinn faidhle, an uairsin le gach sgrìobhadh, bidh an siostam obrachaidh a’ sgrùdadh meud an fhaidhle agus a’ sgrìobhadh dàta gu fìor cheann an fhaidhle, agus a’ dèanamh seo gu atamach. Leigidh seo le iomadh snàithlean no pròiseas sgrìobhadh chun aon fhaidhle. Ach anns a’ chòd againn cha bhith sinn a’ cleachdadh a’ bhratach seo. Chì sinn meud faidhle eadar-dhealaichte ann an lsof after trunk a-mhàin ma dh'fhosglas sinn am faidhle airson sgrìobhadh a bharrachd, a tha a 'ciallachadh anns a' chòd againn an àite sin

with open("123.txt", "w") as f:

feumaidh sinn a chuir

with open("123.txt", "a") as f:

Dèan sgrùdadh leis a’ bhratach “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 a' bhratach "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ògramadh pròiseas a tha a’ ruith mu thràth

Gu tric bidh prògramadairean, nuair a bhios iad a’ cruthachadh agus a’ dèanamh deuchainn air prògraman, a’ cleachdadh debuggers (mar eisimpleir GDB) no diofar ìrean de logadh a-steach don tagradh. Tha Linux a 'toirt seachad comas air prògram a tha a' ruith mar-thà a sgrìobhadh agus atharrachadh, mar eisimpleir, atharraich luachan caochladairean, suidhich briseadh, msaa, msaa.

A’ tilleadh chun cheist thùsail mu nach eil àite diosc gu leòr airson faidhle a sgrìobhadh, feuchaidh sinn ris an duilgheadas a shamhlachadh.

Cruthaichidh sinn faidhle airson ar sgaradh, a chuireas sinn suas mar diosc air leth:

[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 ~]$

Nach cruthaich sinn siostam faidhle:

[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 ~]$

Stàlaich an siostam faidhle:

[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

Bidh sinn a’ cruthachadh eòlaire leis an t-sealbhadair againn:

[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs

Nach fosgail sinn am faidhle airson sgrìobhadh a-mhàin sa phrògram againn:

with open("/mnt/logs/123.txt", "w") as f:

Cur air bhog

[user@localhost ]$ python openforwrite.py 

Bidh sinn a 'feitheamh beagan dhiog

[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  8.0M     0 100% /mnt

Mar sin, tha an duilgheadas againn air a mhìneachadh aig toiseach an artaigil seo. Àite an-asgaidh 0, 100% air a ghabhail thairis.

Tha sinn a’ cuimhneachadh, a rèir cumhaichean na h-obrach, gu bheil sinn a’ feuchainn ri dàta fìor chudromach a chlàradh nach gabh a chall. Agus aig an aon àm, feumaidh sinn an t-seirbheis a chàradh gun a bhith ag ath-thòiseachadh a 'phròiseas.

Canaidh sinn gu bheil àite diosc againn fhathast, ach ann an sgaradh eadar-dhealaichte, mar eisimpleir san / dachaigh.

Feuchaidh sinn ri “ath-chlàradh air an itealan” ar còd.

Bheir sinn sùil air PID ar pròiseas, a tha air a h-uile àite diosc ithe suas:

[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

Dèan ceangal ris a’ phròiseas tro gdb

[user@localhost ~]$ gdb -p 10078
...
(gdb) 

Bheir sinn sùil air na tuairisgeulan faidhle fosgailte:

(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

Bidh sinn a’ coimhead air an fhiosrachadh mu thuairisgeul faidhle àireamh 3, a tha inntinneach dhuinn

(gdb) shell cat /proc/10078/fdinfo/3
pos:    8189952
flags:  0100001
mnt_id: 482

A’ cumail nar n-aire dè an t-ainm siostam a bhios Python a’ dèanamh (faic gu h-àrd far an do ruith sinn air adhart agus lorg sinn a’ ghairm fhosgailte), nuair a bhios sinn a’ giullachd ar còd gus faidhle fhosgladh, bidh sinn a’ dèanamh an aon rud sinn fhìn às leth ar pròiseas, ach feumaidh sinn an O_WRONLY|O_CREAT| Tha luach àireamhach nan àite pìosan O_TRUNC. Gus seo a dhèanamh, fosgail na stòran kernel, mar eisimpleir an seo agus coimhead air dè na brataichean as coireach airson dè

#define O_WRONLY 00000001
#define O_CREAT 00000100
#define O_TRUNC 00001000

Bidh sinn a’ cothlamadh na luachan gu lèir ann an aon, gheibh sinn 00001101

Bidh sinn a’ ruith ar gairm bho gdb

(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4

Mar sin fhuair sinn tuairisgeul faidhle ùr le àireamh 4 agus faidhle fosgailte ùr air sgaradh eile, nì sinn sgrùdadh:

(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

Tha sinn a 'cuimhneachadh air an eisimpleir le pìob - mar a dh'atharraicheas bash tuairisgeulan faidhle, agus tha sinn air a' ghairm siostam dup2 ionnsachadh mu thràth.

Feuchaidh sinn ri tuairisgeul faidhle eile a chuir na àite

(gdb) call dup2(4,3)
$2 = 3

Bidh sinn a ’sgrùdadh:

(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

Bidh sinn a’ dùnadh tuairisgeul faidhle 4, leis nach eil feum againn air:

(gdb) call close (4)
$1 = 0

Agus fàg 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

A' sgrùdadh an fhaidhle ùr:

[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 chì thu, tha an dàta air a sgrìobhadh gu faidhle ùr, leig dhuinn sùil a thoirt air an t-seann fhear:

[user@localhost ~]$ ls -lah /mnt/logs/123.txt 
-rw-rw-r-- 1 user user 7.9M Oct  8 11:08 /mnt/logs/123.txt

Chan eil dàta air chall, tha an tagradh ag obair, tha logaichean air an sgrìobhadh gu àite ùr.

Dèanamaid beagan iom-fhillte air an obair

Smaoinich gu bheil an dàta cudromach dhuinn, ach chan eil àite diosc againn ann an gin de na pàirtean agus chan urrainn dhuinn an diosc a cheangal.

Is urrainn dhuinn an dàta againn ath-stiùireadh an àiteigin, mar eisimpleir gu pìob, agus an uair sin dàta ath-stiùireadh bhon phìob chun lìonra tro phrògram air choreigin, mar eisimpleir netcat.
Is urrainn dhuinn pìob ainmichte a chruthachadh leis an àithne mkfifo. Cruthaichidh e faidhle meallta air an t-siostam faidhle eadhon ged nach eil àite an-asgaidh air.

Ath-thòisich an tagradh agus thoir sùil air:

[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

Chan eil àite diosc ann, ach bidh sinn gu soirbheachail a’ cruthachadh pìob ainmichte an sin:

[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

A-nis feumaidh sinn dòigh air choireigin an dàta gu lèir a thèid a-steach don phìob seo a phasgadh gu frithealaiche eile tron ​​​​lìonra; tha an aon netcat freagarrach airson seo.

Air an fhrithealaiche remote-server.example.com bidh sinn a 'cur air bhog

[user@localhost ~]$ nc -l 7777 > 123.txt 

Air an t-seirbheisiche trioblaideach againn bidh sinn a’ cur air bhog ann an inneal-crìochnachaidh air leth

[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe 

A-nis thèid an dàta gu lèir a thig gu crìch sa phìob gu fèin-ghluasadach gu stdin ann an netcat, a chuireas chun lìonra air port 7777 e.

Chan eil againn ach tòiseachadh air ar dàta a sgrìobhadh a-steach don phìob ainmichte seo.

Tha an aplacaid againn mu thràth a’ ruith:

[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

De na brataichean gu lèir, chan fheum sinn ach O_WRONLY leis gu bheil am faidhle ann mu thràth agus chan fheum sinn 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

A' sgrùdadh an fhrithealaiche iomallach remote-server.example.com

[user@localhost ~]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 38M Oct  8 14:21 123.txt

Tha an dàta a 'tighinn, bidh sinn a' sgrùdadh an fhrithealaiche duilgheadas

[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

Tha an dàta air a shàbhaladh, tha an duilgheadas air fhuasgladh.

Gabhaidh mi an cothrom seo a ràdh hello ri mo cho-obraichean bho Degiro.
Èist ri podcasts Radio T.

Math dha na h-uile.

Mar obair-dachaigh, tha mi a’ moladh gun smaoinich thu air na bhios anns na tuairisgeulan faidhle pròiseas cat is cadal ma ruitheas tu an àithne a leanas:

[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000

Source: www.habr.com

Cuir beachd ann