Faili tsananguro muLinux ine mienzaniso

Pane imwe nguva, panguva yekubvunzurudzwa, ndakabvunzwa, chii chauchaita kana iwe ukawana sevhisi isingashande nekuda kwekuti dhisiki yapera nzvimbo?

Chokwadi, ndakapindura kuti ndaizoona zvakagarwa nenzvimbo iyi uye, kana zvichiita, ndaizochenesa nzvimbo yacho.
Ipapo mubvunzurudzo akabvunza, ko kana pasina nzvimbo yakasununguka pane chikamu, asi iwewo hauoni chero mafaira angatora nzvimbo yose?

Kune izvi ndakati iwe unogona kugara uchitarisa yakavhurika faira descriptors, semuenzaniso ne lsof command, uye unzwisise kuti ndeipi application yatora nzvimbo yese iripo, uye ipapo iwe unogona kuita zvinoenderana nemamiriro ezvinhu, zvichienderana nekuti iyo data inodiwa. .

Mubvunzurudzo akandikanganisa pashoko rekupedzisira, achiwedzera kumubvunzo wake: "Ngatiti isu hatidi data, ingori debug log, asi iyo application haishande nekuti haikwanise kunyora debug"?

"Zvakanaka," ndakapindura, "tinogona kudzima debug mugadziriro yekushandisa toitangazve."
Mubvunzurudzo akaramba: "Kwete, isu hatigone kutangazve application, tichine data rakakosha rakachengetwa mundangariro, uye vatengi vakakosha vakabatana nesevhisi pachayo, yatisingakwanise kumanikidza kuti tibatane zvakare."

"Zvakanaka," ndakadaro, "kana tikatadza kutangazve kunyorera uye data haina kukosha kwatiri, saka tinogona kungojekesa iyi faira rakavhurika kuburikidza neiyo faira descriptor, kunyangwe isu tisingazvione mumirairo yels. pafaira system."

Mubvunzi akafara, asi ini handina.

Ipapo ndakafunga kuti, sei munhu anoedza zivo yangu asingacherere zvakadzika? Asi zvakadini kana iyo data yakakosha shure kwezvose? Zvakadini kana isu tisingakwanisi kutangazve maitiro, uye maitiro anonyora kune faira system pane chikamu chisina nzvimbo yemahara? Zvakadini kana isu tisingakwanisi kurasikirwa kwete chete data yakatove yakanyorwa, asiwo data iyo iyi nzira inonyora kana kuedza kunyora?

Tuzik

Pakutanga kwebasa rangu, ndakaedza kugadzira diki application yaida kuchengetedza ruzivo rwemushandisi. Uye ipapo ndakafunga, ndingafananidza sei mushandisi nedata rake. Somuenzaniso, ndine Ivanov Ivan Ivanovich, uye ane mamwe mashoko, asi ndingaita sei ushamwari navo? Ndinogona kutaura zvakananga kuti imbwa inonzi "Tuzik" ndeyeIvan uyu chaiye. Asi zvakadini kana akachinja zita rake uye panzvimbo yaIvan anova, somuenzaniso, Olya? Zvadaro zvichazoitika kuti Olya Ivanovna Ivanova wedu haazovi nembwa, uye Tuzik yedu icharamba iri yeIvan asipo. Dhatabhesi iyo yakapa mushandisi wega wega identifier (ID) yakabatsira kugadzirisa dambudziko iri, uye yangu Tuzik yakasungirirwa kune iyi ID, iyo, chokwadi, yaingova serial nhamba. Nokudaro, muridzi weTuzik aiva nenhamba ye2, uye pane imwe nguva Ivan akanga ari pasi pechiziviso ichi, uye Olya akazova pasi peiyo ID. Dambudziko revanhu nekuchengeta mhuka rakagadziriswa.

Faira descriptor

Dambudziko refaira uye purogiramu inoshanda nefaira iyi inenge yakangofanana neyo imbwa yedu nemurume. Ngatitii ndakazarura faira inonzi ivan.txt ndokutanga kunyora shoko rokuti tuzik mukati maro, asi ndakakwanisa kunyora tsamba yekutanga "t" mufaira, uye iyi faira yakatumidzwa nemumwe munhu, somuenzaniso, ku olya.txt. Asi iyo faira inoramba yakafanana, uye ini ndichiri kuda kurekodha ace yangu mairi. Pese painovhurwa faira nekufona system yakazaruka mune chero mutauro wechirongwa ndinogamuchira ID yakasarudzika inondinongedza kufaira, iyi ID ndiyo inotsanangura faira. Uye hazvina basa zvachose uye ndiani anoita neiyi faira inotevera, inogona kubviswa, inogona kupihwa zita, muridzi anogona kuchinjwa, kana kodzero yekuverenga nekunyora inogona kubviswa, ini ndichiri kuwana kwairi, nokuti panguva yekuvhura faira, ndaive nekodzero yekuverenga uye / kana kuinyora uye ndakakwanisa kutanga kushanda nayo, zvinoreva kuti ndinofanira kuramba ndichidaro.

MuLinux, libc raibhurari inovhura 3 mafaera ekutsanangura kune yega yega inomhanya application (maitiro), akaverengerwa 0,1,2. Rumwe ruzivo runogona kuwanikwa pane zvinongedzo murume stdio ΠΈ murume stdout

  • Faili tsananguro 0 inonzi STDIN uye inosanganiswa nekuisa application
  • Faili descriptor 1 inonzi STDOUT uye inoshandiswa nemaapplication kuburitsa data, senge mirairo yekudhinda
  • Faili tsananguro 2 inonzi STDERR uye inoshandiswa nemaapplication kuburitsa mameseji ekukanganisa.

Kana muchirongwa chako ukavhura chero faira rekuverenga kana kunyora, saka kazhinji iwe uchawana yekutanga yemahara ID uye ichave nhamba 3.

Rondedzero yezvitsanangudzo zvefaira inogona kutariswa kune chero maitiro kana iwe uchiziva PID yayo.

Semuenzaniso, ngativhure bash koni uye titarise iyo PID yemaitiro edu

[user@localhost ]$ echo $$
15771

Mune yechipiri console ngatimhanyei

[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

Iwe unogona kufuratira zvakachengeteka faira descriptor nhamba 255 nekuda kwezvinangwa zvechinyorwa ichi; yakavhurirwa zvido zvayo nebash pachayo, uye kwete neraibhurari yakabatana.

Iye zvino ese matatu anotsanangura mafaera akabatana neiyo pseudo terminal mudziyo /dev/pts, asi isu tinogona kuramba tichivanyengedza, semuenzaniso, kuvamhanyisa mune yechipiri koni

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

Uye mune yekutanga console tichaona

[user@localhost ]$ hello world

Redirect uye Pipe

Iwe unogona nyore kupfuudza aya matatu anotsanangura mafaera mune chero maitiro, kusanganisira mubash, semuenzaniso kuburikidza nepombi inobatanidza maitiro maviri, ona.

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

Unogona kumhanya murairo uyu iwe pachako mutsara -f mugoona zviri mukati, asi ndichakuudzai muchidimbu.

Mubereki wedu bash maitiro nePID 15771 anoisa murairo wedu uye anonzwisisa chaizvo kuti mingani mirairo yatinoda kumhanya, mune yedu kune maviri acho: katsi uye kurara. Bash anoziva kuti inoda kugadzira maviri evana maitiro, uye ovasanganisa kuita pombi imwe. Pakazara, bash inoda 2 maitiro emwana uye imwe pombi.

Bash anomhanyisa system yekufona asati agadzira maitiro emwana pipe uye inogamuchira zvitsva zvinotsanangura faira pane yenguva pfupi pombi buffer, asi iyi buffer haisati yabatanidza maitiro edu maviri evana.

Kune maitiro evabereki, zvinoita sekunge kwatove nepombi, asi hapana maitiro emwana parizvino:

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

Wobva washandisa iyo system call clone bash inogadzira maitiro maviri evana, uye maitiro edu matatu anotaridzika seizvi:

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

Usakanganwa kuti clone inogadzirisa maitiro pamwe chete nezvose zvinotsanangura faira, saka zvichave zvakafanana mukuita kwevabereki uye mumwana. Basa rekuita kwemubereki nePID 15771 nderekutarisa maitirwo emwana, saka rinongomirira mhinduro kubva kuvana.

Naizvozvo, haidi pombi, uye inovhara mafaera anotsanangura nhamba 3 uye 4.

Mune yekutanga mwana bash process nePID 9004, iyo system inofona dup2, inoshandura STDOUT file descriptor nhamba 1 kune faira descriptor inongedza pombi, kwatiri isu nhamba 3. Nokudaro, zvinhu zvose izvo mwana wekutanga anogadzirisa nePID 9004 anonyora kuSTDOUT zvichangoerekana zvapera mubhobho yepombi.

Muchikamu chechipiri chemwana nePID 9005, bash inoshandisa dup2 kuti ichinje faira descriptor STDIN nhamba 0. Iye zvino zvose izvo bash yedu yechipiri nePID 9005 ichaverengwa ichaverengwa kubva pombi.

Mushure meizvi, faira tsananguro dzakaverengerwa 3 uye 4 dzakavharwawo mumaitiro emwana, sezvo dzisisashandiswe.

Ini ndinofuratira nemaune faira descriptor 255; inoshandiswa kune zvemukati zvinangwa nebash pachayo uye zvakare ichavharwa mumaitiro emwana.

Tevere, mukuita kwemwana wekutanga nePID 9004, bash inotanga kushandisa kufona system exec iyo faira inoshandiswa yatakatsanangura pamutsetse wekuraira, kwatiri isu ndeye /usr/bin/cat.

Muchikamu chechipiri chemwana nePID 9005, bash inomhanya yechipiri inoitwa yatakatsanangura, kwatiri /usr/bin/sleep.

Iyo exec system yekufona haivhare zvibato zvefaira kunze kwekunge zvavhurwa nemureza weO_CLOEXEC panguva yakavhurwa kufona. Muchiitiko chedu, mushure mekutangisa mafaera anogona kuitiswa, ese aripo anotsanangura faira achachengetwa.

Tarisa pane 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

Sezvauri kuona, iyo yakasarudzika nhamba yepombi yedu yakafanana mune ese maviri maitiro. Nokudaro tine hukama pakati pemaitiro maviri akasiyana nemubereki mumwechete.

Kune avo vasingazive nezve system inofona iyo bash inoshandisa, ini ndinokurudzira kumhanyisa mirairo kuburikidza ne strace uye kuona zviri kuitika mukati, semuenzaniso seizvi:

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

Ngatidzokere kudambudziko redu neiyo yakaderera disk nzvimbo uye kuyedza kuchengetedza data pasina kutangazve maitiro. Ngatinyorei chirongwa chidiki chinozonyora ingangoita 1 megabyte pasekondi kune diski. Uyezve, kana nekuda kwechimwe chikonzero isu tisingakwanisi kunyora data ku diski, isu tichangorega izvi uye edza kunyora data zvakare mumasekondi. Mumuenzaniso wandiri kushandisa Python, unogona kushandisa chero mutauro wechirongwa.

[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

Ngatimhanyei chirongwa uye titarise mafaera anotsanangura

[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

Sezvauri kuona, isu tine edu matatu akajairwa faira anotsanangura uye imwezve yatakavhura. Ngatitarisei saizi yefaira:

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

Iyo data iri kunyorwa, tinoedza kushandura mvumo pafaira:

[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

Isu tinoona kuti iyo data ichiri kunyorwa, kunyangwe mushandisi wedu asina mvumo yekunyorera kufaira. Ngatiedze kuibvisa:

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

Iyo data yakanyorwa kupi? Uye akanyorwa zvachose here? Tinoongorora:

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

Hongu, faira yedu inotsanangura ichiripo uye tinogona kubata iyi faira inotsanangura senge faira redu rekare, tinogona kuverenga, kujekesa uye kuikopa.

Ngatitarisei saizi yefaira:

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

Saizi yefaira ndeye 19923457. Ngatiedzei kudzima faira:

[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

Sezvauri kuona, saizi yefaira iri kungowedzera uye hunde yedu haina kushanda. Ngatitarisei kuhurongwa hwekufona zvinyorwa yakazaruka. Kana tikashandisa O_APPEND mureza pakuvhura faira, zvino nekunyora kwega kwega, sisitimu yekushandisa inotarisa saizi yefaira uye inonyora data kusvika kumagumo efaira, uye inoita izvi atomu. Izvi zvinobvumira tambo dzakawanda kana maitiro kuti anyore kune imwechete faira. Asi mukodhi yedu hatishandise mureza uyu. Tinogona kuona saizi yakasiyana yefaira mu lsof mushure me trunk chete kana tikavhura faira rekuwedzera kunyora, zvinoreva mukodhi yedu panzvimbo.

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

tinofanira kuisa

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

Kutarisa ne "w" mureza

[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

uye ne "a" mureza

[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

Kugadzira hurongwa hwagara huri kushanda

Kazhinji vanogadzira zvirongwa, pavanenge vachigadzira uye vachiyedza zvirongwa, shandisa debugger (semuenzaniso GDB) kana mazinga akasiyana ekupinda mukushandisa. Linux inopa kugona kunyora uye kushandura iyo yagara ichimhanya chirongwa, semuenzaniso, shandura kukosha kwezvakasiyana, kuseta breakpoint, nezvimwe, nezvimwe.

Kudzokera kumubvunzo wepakutanga pamusoro pekusakwana dhisiki nzvimbo yekunyora faira, ngatiedze kutevedzera dambudziko.

Ngatigadzire faira yekugovera kwedu, iyo yatinozokwira sedhisiki yakaparadzana:

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

Ngatigadzirei faira system:

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

Mount iyo faira system:

[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

Isu tinogadzira dhairekitori nemuridzi wedu:

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

Ngativhure faira rekunyora chete muchirongwa chedu:

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

Kutanga

[user@localhost ]$ python openforwrite.py 

Tinomirira masekonzi mashoma

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

Saka, isu tine dambudziko rakatsanangurwa pakutanga kwechinyorwa chino. Nzvimbo yemahara 0, 100% yakagarwa.

Tinoyeuka kuti maererano nemamiriro ezvinhu ebasa racho, tiri kuedza kunyora data yakakosha zvikuru iyo isingagoni kurasika. Uye panguva imwecheteyo, tinoda kugadzirisa sevhisi pasina kutangazve maitiro.

Ngatiti isu tichine diski nzvimbo, asi mune imwe chikamu chakasiyana, semuenzaniso mukati / kumba.

Ngatiedzei "kurongazve pane nhunzi" kodhi yedu.

Ngatitarisei iyo PID yemaitiro edu, ayo akadya yese dhisiki nzvimbo:

[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

Batanidza kune maitiro kuburikidza ne gdb

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

Ngatitarisei kune akavhurika faira descriptors:

(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

Isu tinotarisa ruzivo nezve faira descriptor nhamba 3, iyo inofadza isu

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

Tichifunga nezve system inodaidza Python inoita (ona pamusoro patakamhanya tikawana runhare rwakavhurika), patinenge tichigadzira kodhi yedu kuti tivhure faira, isu tinoita zvakafanana isu pachinzvimbo chemaitiro edu, asi isu tinoda iyo O_WRONLY|O_CREAT| O_TRUNC mabhiti anotsiva nenhamba yakakosha. Kuti uite izvi, vhura iyo kernel masosi, semuenzaniso pano uye tarisa kuti ndeapi mireza ine basa rei

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

Isu tinosanganisa ese kukosha kuita imwe, tinowana 00001101

Isu tinomhanyisa kufona kwedu kubva kugdb

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

Saka isu takawana nyowani faira descriptor ine nhamba 4 uye nyowani yakavhurika faira pane imwe partition, isu tinotarisa:

(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

Isu tinorangarira muenzaniso nepombi - kuti bash inoshandura sei faira descriptors, uye isu takatodzidza iyo dup2 system call.

Isu tinoedza kutsiva imwe faira descriptor neimwe

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

Tinotarisa:

(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

Isu tinovhara faira descriptor 4, sezvo isu hatizvide:

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

Uye kubuda 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

Kutarisa faira idzva:

[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

Sezvauri kuona, iyo data yakanyorerwa faira nyowani, ngatitarisei yekare:

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

Hapana data yakarasika, iyo application inoshanda, matanda anonyorerwa kunzvimbo itsva.

Ngatiomese basa zvishoma

Ngatimbofungidzira kuti iyo data yakakosha kwatiri, asi isu hatina dhisiki nzvimbo mune chero yezvikamu uye isu hatigone kubatanidza dhisiki.

Chatinogona kuita kuendesa zvakare data redu kumwe kunhu, semuenzaniso kupombi, uyezve kutungamira data kubva pombi kuenda kunetiweki kuburikidza neimwe chirongwa, semuenzaniso netcat.
Tinogona kugadzira pombi ine zita rekuti mkfifo command. Ichagadzira pseudo faira pane faira system kunyangwe pasina nzvimbo yemahara pairi.

Tangazve application uye tarisa:

[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

Iko hakuna dhisiki nzvimbo, asi isu takabudirira kugadzira ine zita pombi ipapo:

[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

Zvino isu tinoda neimwe nzira kuputira data rese rinopinda mupombi iyi kune imwe sevha kuburikidza netiweki; iyo imwechete netcat inokodzera izvi.

Pa server remote-server.example.com tinomhanya

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

Pane yedu inonetsa server tinotangisa mune yakaparadzana terminal

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

Iye zvino data rese rinopera mupombi rinongoenda ku stdin mu netcat, iyo inotumira kune network pachiteshi 7777.

Zvese zvatinofanira kuita kutanga kunyora data redu mune iyi pombi yakapihwa zita.

Isu tatova neapp inoshanda:

[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

Pamireza ese, isu tinongoda O_WRONLY sezvo faira ravepo uye hatidi kuribvisa.

[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

Kutarisa iyo iri kure server kure-server.example.com

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

Iyo data iri kuuya, isu tinotarisa dambudziko server

[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

Iyo data inochengetwa, dambudziko rinogadziriswa.

Ndinotora mukana uno kumhorosa vamwe vangu vekuDegiro.
Teerera kuRadio T podcasts.

Kunaka kune vese.

Sebasa remumba, ini ndinokurudzira kuti ufunge nezve zvichange zviri mukuita faira descriptors katsi uye kurara kana iwe uchimhanyisa unotevera kuraira:

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

Source: www.habr.com

Voeg