Fayilo yofotokozera mu Linux yokhala ndi zitsanzo

Nthawi ina, pakufunsidwa, ndidafunsidwa, mungatani ngati mutapeza kuti ntchito sikugwira ntchito chifukwa diski yatha?

Inde, ndinayankha kuti ndiwona chimene chinali ndi malowa ndipo, ngati nkotheka, ndiyeretse malowo.
Kenako wofunsayo anafunsa, bwanji ngati palibe malo aulere pagawo, koma simukuwonanso mafayilo omwe angatenge malo onse?

Kwa izi ndinanena kuti mutha kuyang'ana nthawi zonse zofotokozera mafayilo otseguka, mwachitsanzo ndi lamulo la lsof, ndikumvetsetsa kuti ndi ntchito iti yomwe yatenga malo onse omwe alipo, ndiyeno mutha kuchitapo kanthu malinga ndi momwe zinthu ziliri, kutengera ngati deta ikufunika. .

Wofunsayo adandisokoneza pa mawu otsiriza, ndikuwonjezera ku funso lake: "Tiyerekeze kuti sitikusowa deta, ndizolemba zowonongeka, koma ntchitoyo siigwira ntchito chifukwa sichikhoza kulemba debug"?

"Chabwino," ndidayankha, "titha kuzimitsa kukonza ndikuyambitsanso."
Wofunsayo adatsutsa kuti: "Ayi, sitingathe kuyambitsanso pulogalamuyo, tikadali ndi zofunikira zomwe zasungidwa m'makumbukidwe, ndipo makasitomala ofunikira amalumikizidwa ndi ntchitoyo, zomwe sitingathe kukakamiza kuti tilumikizanenso."

"Chabwino," ndidati, "ngati sitingayambitsenso kugwiritsa ntchito ndipo chidziwitsocho sichofunikira kwa ife, ndiye kuti titha kuchotsa fayilo yotsegukayi kudzera muzofotokozera zamafayilo, ngakhale sitikuwona mu lamulo la ls. pa file system."

Wofunsayo anasangalala, koma sindinatero.

Kenako ndinaganiza, chifukwa chiyani munthu amene amayesa chidziwitso changa samakumba mozama? Koma bwanji ngati deta ndi yofunika pambuyo pa zonse? Bwanji ngati sitingathe kuyambitsanso ndondomeko, ndipo ndondomekoyi ikulembera ku fayilo pagawo lomwe lilibe malo omasuka? Bwanji ngati sitingathe kutaya deta yomwe yalembedwa kale, komanso deta yomwe ndondomekoyi imalemba kapena kuyesa kulemba?

Tuzik

Kumayambiriro kwa ntchito yanga, ndinayesera kupanga pulogalamu yaying'ono yomwe imayenera kusunga zambiri za ogwiritsa ntchito. Ndiyeno ndinaganiza, ndingafanane bwanji ndi wosuta ndi deta yake. Mwachitsanzo, ndili ndi Ivanov Ivan Ivanovich, ndipo ali ndi zambiri, koma ndingapeze bwanji mabwenzi nawo? Ndikhoza kunena mwachindunji kuti galu wotchedwa "Tuzik" ndi wa Ivan yemweyo. Koma bwanji ngati asintha dzina lake ndipo m'malo mwa Ivan amakhala, mwachitsanzo, Olya? Kenaka zidzawoneka kuti Olya Ivanovna Ivanova sadzakhalanso ndi galu, ndipo Tuzik yathu idzakhala ya Ivan kulibe. Dongosolo lachinsinsi lomwe linapatsa aliyense wogwiritsa ntchito chizindikiritso chapadera (ID) linathandizira kuthetsa vutoli, ndipo Tuzik yanga inamangirizidwa ku ID iyi, yomwe, kwenikweni, inali nambala chabe. Choncho, mwini ace anali ID nambala 2, ndipo pa nthawi ina Ivan anali pansi pa ID, ndiye Olya anakhala pansi pa ID yomweyo. Vuto la umunthu ndi kuweta nyama linathetsedwa kwenikweni.

Fayilo yofotokozera

Vuto la fayilo ndi pulogalamu yomwe imagwira ntchito ndi fayiloyi ndi yofanana ndi ya galu wathu ndi munthu. Tiyerekeze kuti ndinatsegula fayilo yotchedwa ivan.txt ndikuyamba kulemba mawu akuti tuzik mmenemo, koma ndinangotha ​​kulemba chilembo choyamba "t" mu fayilo, ndipo fayiloyi inatchedwanso wina, mwachitsanzo, ku olya.txt. Koma fayiloyo imakhala yofanana, ndipo ndikufunabe kulemba ace yanga mmenemo. Nthawi zonse fayilo ikatsegulidwa ndi foni yam'manja lotseguka m'chinenero chilichonse cha mapulogalamu ndimalandira chizindikiritso chapadera chomwe chimandilozera ku fayilo, ID iyi ndi yofotokozera fayilo. Ndipo zilibe kanthu kuti ndi chiyani ndi ndani yemwe achite ndi fayilo yotsatirayi, ikhoza kuchotsedwa, ikhoza kusinthidwanso, mwiniwakeyo akhoza kusinthidwa, kapena ufulu wowerenga ndi kulemba ukhoza kuchotsedwa, ndidzakhala ndi mwayi wopeza. kwa izo, chifukwa pa nthawi yotsegula fayilo, ndinali ndi ufulu wowerenga ndi / kapena kulemba ndipo ndinatha kuyamba kugwira nawo ntchito, zomwe zikutanthauza kuti ndiyenera kupitiriza kutero.

Ku Linux, laibulale ya libc imatsegula mafayilo atatu ofotokozera pa pulogalamu iliyonse (ndondomeko), yowerengedwa 3. Zambiri zitha kupezeka pamalumikizidwe munthu stdio ΠΈ munthu stdout

  • Fayilo yofotokozera 0 imatchedwa STDIN ndipo imalumikizidwa ndi kuyika kwa pulogalamu
  • Fayilo yofotokozera 1 imatchedwa STDOUT ndipo imagwiritsidwa ntchito ndi mapulogalamu kutulutsa deta, monga kusindikiza malamulo
  • Fayilo yofotokozera 2 imatchedwa STDERR ndipo imagwiritsidwa ntchito ndi mapulogalamu kuti atulutse mauthenga olakwika.

Ngati mu pulogalamu yanu mutsegula fayilo iliyonse kuti muwerenge kapena kulemba, ndiye kuti mudzapeza ID yaulere yoyamba ndipo idzakhala nambala 3.

Mndandanda wamafotokozedwe a mafayilo ukhoza kuwonedwa panjira iliyonse ngati mukudziwa PID yake.

Mwachitsanzo, tiyeni titsegule bash console ndikuyang'ana PID ya ndondomeko yathu

[user@localhost ]$ echo $$
15771

Mu console yachiwiri tiyeni tiyendetse

[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

Mutha kunyalanyaza mosamala nambala yofotokozera 255 pazolinga za nkhaniyi; idatsegulidwa pazosowa zake ndi bash yokha, osati ndi laibulale yolumikizidwa.

Tsopano mafayilo onse ofotokozera atatu amalumikizidwa ndi chipangizo cha pseudo terminal /dev/pts, koma tikhoza kuwasokoneza, mwachitsanzo, kuwayendetsa mu console yachiwiri

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

Ndipo mu console yoyamba tiwona

[user@localhost ]$ hello world

Kuwongolera ndi Pipe

Mutha kuwongolera mosavuta mafayilo ofotokozera a 3 mwanjira iliyonse, kuphatikiza mu bash, mwachitsanzo kudzera pa chitoliro cholumikiza njira ziwiri, onani.

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

Mutha kuyendetsa izi nokha ndi mzere -f ndipo muwone zomwe zikuchitika mkatimo, koma ndikuwuzani mwachidule.

Makolo athu a bash ndi PID 15771 amagawa lamulo lathu ndikumvetsetsa ndendende malamulo angati omwe tikufuna kutsata, kwa ife pali awiri a iwo: mphaka ndi kugona. Bash amadziwa kuti ikufunika kupanga njira ziwiri za ana, ndikuziphatikiza mu chitoliro chimodzi. Pazonse, bash adzafunika njira 2 za ana ndi chitoliro chimodzi.

Bash amayendetsa kuyimba kwadongosolo asanapange njira za ana chitoliro ndipo imalandira zofotokozera zatsopano zamafayilo pakanthawi kochepa katope, koma buffer iyi sinalumikize njira zathu ziwiri za ana.

Pazochitika za makolo, zikuwoneka ngati pali kale chitoliro, koma palibe njira za ana:

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

Kenako kugwiritsa ntchito kuyimba foni choyerekeza bash imapanga njira ziwiri za ana, ndipo njira zathu zitatu ziziwoneka motere:

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

Musaiwale kuti clone imagwirizanitsa ndondomekoyi pamodzi ndi zofotokozera zonse za fayilo, kotero zidzakhala zofanana muzochitika za makolo komanso mwa mwana. Ntchito ya makolo ndi PID 15771 ndikuwunika momwe mwana amachitira, chifukwa chake amangodikirira yankho kuchokera kwa ana.

Chifukwa chake, sichifunikira chitoliro, ndipo imatseka zofotokozera zamafayilo 3 ndi 4.

Mu njira yoyamba ya bash ya ana ndi PID 9004, dongosolo limayimba dup2, amasintha fayilo yathu ya STDOUT yofotokozera nambala 1 ku fayilo yofotokozera yomwe ikulozera ku chitoliro, kwa ife ndi nambala 3. Choncho, chirichonse chimene mwana woyamba amachitira ndi PID 9004 akulemba ku STDOUT chidzangokhalira mu buffer ya chitoliro.

Mu ndondomeko ya mwana wachiwiri ndi PID 9005, bash amagwiritsa ntchito dup2 kuti asinthe fayilo yofotokozera STDIN nambala 0. Tsopano chirichonse chimene bash yathu yachiwiri ndi PID 9005 idzawerengedwa chidzawerengedwa kuchokera ku chitoliro.

Pambuyo pake, zofotokozera zamafayilo zowerengera 3 ndi 4 zimatsekedwanso munjira zamwana, popeza sizigwiritsidwanso ntchito.

Ndimanyalanyaza mwadala chofotokozera 255; imagwiritsidwa ntchito pazolinga zamkati ndi bash yokha ndipo imatsekedwanso munjira za ana.

Kenako, munjira yamwana woyamba ndi PID 9004, bash akuyamba kugwiritsa ntchito kuyimba foni exec fayilo yomwe ingathe kuchitidwa yomwe tidatchula pamzere wolamula, kwa ife ndi /usr/bin/cat.

Munjira yachiwiri ya mwana ndi PID 9005, bash imayendetsa chachiwiri chomwe tidafotokoza, kwa ife /usr/bin/sleep.

Kuitana kwa exec sikumatseka ma fayilo pokhapokha atatsegulidwa ndi mbendera ya O_CLOEXEC panthawi yomwe kuyimba kotseguka kudapangidwa. Kwa ife, mutayambitsa mafayilo omwe angathe kuchitidwa, zolemba zonse zamakono zidzasungidwa.

Onani mu 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

Monga mukuonera, nambala yapadera ya chitoliro chathu ndi yofanana muzochita zonse ziwiri. Chifukwa chake tili ndi kulumikizana pakati pa njira ziwiri zosiyana ndi kholo limodzi.

Kwa iwo omwe sadziwa ma foni omwe bash amagwiritsa ntchito, ndimalimbikitsa kwambiri kuyendetsa malamulowo kudzera muzitsulo ndikuwona zomwe zikuchitika mkati, mwachitsanzo monga chonchi:

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

Tiyeni tibwerere ku vuto lathu ndi malo otsika a disk ndikuyesera kusunga deta popanda kuyambitsanso ndondomekoyi. Tiyeni tilembe pulogalamu yaying'ono yomwe ingalembe pafupifupi megabyte 1 pa sekondi imodzi ku disk. Komanso, ngati pazifukwa zina sitinathe kulemba deta ku diski, tidzangonyalanyaza izi ndikuyesera kulembanso deta kachiwiri. Muchitsanzo chomwe ndikugwiritsa ntchito Python, mutha kugwiritsa ntchito chilankhulo china chilichonse.

[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

Tiyeni tiyendetse pulogalamuyi ndikuyang'ana zofotokozera za fayilo

[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

Monga mukuwonera, tili ndi zofotokozera zathu zamafayilo 3 ndi zina zomwe tidatsegula. Tiyeni tiwone kukula kwa fayilo:

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

Zomwe zikulembedwa, timayesetsa kusintha zilolezo pafayilo:

[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

Tikuwona kuti deta ikulembedwabe, ngakhale wogwiritsa ntchito alibe chilolezo cholembera fayilo. Tiyeni tiyese kuchotsa:

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

Kodi deta yalembedwa kuti? Ndipo kodi iwo analembedwa konse? Tikuwona:

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

Inde, ofotokozera mafayilo athu akadalipo ndipo tikhoza kuchitira chofotokozera fayiloyi ngati fayilo yathu yakale, tikhoza kuwerenga, kumveketsa ndikuyikopera.

Tiyeni tiwone kukula kwa fayilo:

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

Kukula kwa fayilo ndi 19923457. Tiyeni tiyese kuchotsa fayiloyi:

[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

Monga mukuonera, kukula kwa fayilo kukungowonjezereka ndipo thunthu lathu silinagwire ntchito. Tiyeni tiwone zolembedwa zoyimba foni lotseguka. Ngati tigwiritsa ntchito mbendera ya O_APPEND potsegula fayilo, ndiye kuti polemba chilichonse, makina ogwiritsira ntchito amayang'ana kukula kwa fayilo ndikulemba deta mpaka kumapeto kwa fayilo, ndikuchita izi mwa atomiki. Izi zimalola ulusi kapena njira zingapo kuti zilembe ku fayilo yomweyo. Koma mu code yathu sitigwiritsa ntchito mbendera iyi. Titha kuwona kukula kwa fayilo mu lsof pambuyo pa thunthu pokhapokha titsegula fayilo kuti tilembe zina, zomwe zikutanthauza mu code yathu m'malo mwake.

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

tiyenera kuyika

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

Kuwona ndi mbendera "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

ndi mbendera "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

Kupanga ndondomeko yomwe ikuchitika kale

Nthawi zambiri opanga mapulogalamu, popanga ndi kuyesa mapulogalamu, amagwiritsa ntchito zosokoneza (mwachitsanzo GDB) kapena milingo yosiyanasiyana yolowera mu pulogalamuyi. Linux imapereka kuthekera kolemba ndikusintha pulogalamu yomwe yayamba kale, mwachitsanzo, kusintha makonda amitundu, kukhazikitsa malo opumira, ndi zina zambiri.

Kubwerera ku funso loyambirira loti palibe malo okwanira a disk kuti tilembe fayilo, tiyeni tiyese kutsanzira vutoli.

Tiyeni tipange fayilo ya magawo athu, omwe tidzayika ngati disk yosiyana:

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

Tiyeni tipange fayilo ya fayilo:

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

Konzani fayilo ya fayilo:

[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

Timapanga chikwatu ndi eni ake:

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

Tiyeni titsegule fayilo kuti tilembe mu pulogalamu yathu yokha:

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

Yambitsani

[user@localhost ]$ python openforwrite.py 

Timadikirira masekondi angapo

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

Choncho, tili ndi vuto lomwe tafotokoza kumayambiriro kwa nkhaniyi. Malo aulere 0, 100% otanganidwa.

Timakumbukira kuti molingana ndi momwe ntchitoyi ikuyendera, tikuyesera kulemba deta yofunika kwambiri yomwe sitingathe kutayika. Ndipo panthawi imodzimodziyo, tiyenera kukonza utumiki popanda kuyambitsanso ndondomekoyi.

Tinene kuti tikadali ndi malo a disk, koma mu magawo osiyanasiyana, mwachitsanzo mkati / kunyumba.

Tiyeni tiyese "kukonzanso mwachangu" khodi yathu.

Tiyeni tiwone PID ya ndondomeko yathu, yomwe yadya malo onse a disk:

[user@localhost ~]$ ps axuf | grep [o]penfor
user 10078 27.2  0.0 128600  5744 pts/22   R+   11:06   0:02  |   _ python openforwrite.py

Lumikizani ku ndondomekoyi kudzera pa gdb

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

Tiyeni tiwone zofotokozera za fayilo yotseguka:

(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

Timayang'ana zambiri za fayilo yofotokozera nambala 3, zomwe zimatisangalatsa

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

Kukumbukira zomwe Python imatcha dongosolo (onani pamwambapa pomwe tidathamangira ndikupeza kuyimba kotseguka), pokonza khodi yathu kuti titsegule fayilo, timachita chimodzimodzi m'malo mwa njira yathu, koma timafunikira O_WRONLY|O_CREAT| O_TRUNC bits m'malo ndi nambala. Kuti muchite izi, tsegulani magwero a kernel, mwachitsanzo apa ndipo yang'anani mbendera zomwe zili ndi udindo pa chiyani

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

Timaphatikiza zikhalidwe zonse kukhala chimodzi, timapeza 00001101

Timayimba foni kuchokera ku gdb

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

Chifukwa chake tili ndi chofotokozera chatsopano cha fayilo ndi nambala 4 ndi fayilo yatsopano yotseguka pagawo lina, timayang'ana:

(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

Timakumbukira chitsanzo ndi chitoliro - momwe bash amasinthira ofotokozera mafayilo, ndipo taphunzira kale kuyimba kwa dongosolo la dup2.

Timayesa kusintha fayilo imodzi yofotokozera ndi ina

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

Kufufuza:

(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

Timatseka chofotokozera 4, chifukwa sitichifuna:

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

Ndipo tulukani 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

Kuyang'ana fayilo yatsopano:

[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

Monga mukuonera, deta imalembedwa ku fayilo yatsopano, tiyeni tiwone yakale:

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

Palibe deta yomwe yatayika, ntchitoyo imagwira ntchito, zipika zimalembedwa kumalo atsopano.

Tiyeni tiwunikire ntchitoyi pang'ono

Tiyerekeze kuti deta ndi yofunika kwa ife, koma tilibe malo a disk mu magawo aliwonse ndipo sitingathe kulumikiza disk.

Zomwe tingachite ndikulozeranso deta yathu kwinakwake, mwachitsanzo poyimba, ndikulozeranso deta kuchokera ku chitoliro kupita ku netiweki kudzera mu pulogalamu ina, mwachitsanzo netcat.
Titha kupanga chitoliro chotchedwa ndi lamulo la mkfifo. Idzapanga fayilo ya pseudo pamafayilo ngakhale palibe malo omasuka.

Yambitsaninso pulogalamuyo ndikuwona:

[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

Palibe danga la disk, koma tidapanga bwino chitoliro chotchulidwa pamenepo:

[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

Tsopano tifunika kukulunga mwanjira ina zonse zomwe zimalowa mu chitoliro ichi kupita ku seva ina kudzera pa netiweki; netcat yomweyo ndiyoyenera izi.

Pa seva remote-server.example.com timathamanga

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

Pa seva yathu yovuta timayambitsa mu terminal ina

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

Tsopano deta yonse yomwe imathera mu chitoliro idzapita ku stdin mu netcat, yomwe idzatumiza ku netiweki pa doko 7777.

Zomwe tiyenera kuchita ndikuyamba kulemba deta yathu mupaipi yotchulidwa iyi.

Tili ndi kale kugwiritsa ntchito pulogalamuyi:

[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

Pa mbendera zonse, timangofunika O_WRONLY popeza fayiloyo ilipo kale ndipo sitiyenera kuichotsa.

[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

Kuyang'ana pa seva yakutali remote-server.example.com

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

Deta ikubwera, timayang'ana vuto la seva

[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

Deta imasungidwa, vuto limathetsedwa.

Ndimatenga mwayi uwu kunena moni kwa anzanga aku Degiro.
Mverani ma podikasiti a Radio-T.

Zabwino zonse.

Monga homuweki, ndikukupemphani kuti muganizire zomwe zidzakhale pakapangidwe ka fayilo ndi kugona ngati mutsatira lamulo ili:

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

Source: www.habr.com

Kuwonjezera ndemanga