Cov ntaub ntawv piav qhia hauv Linux nrog piv txwv

Ib zaug, hauv kev xam phaj, kuv tau nug koj yuav ua li cas yog tias koj pom qhov kev pabcuam tawg vim tias lub disk tau khiav tawm ntawm qhov chaw?

Tau kawg, kuv teb tias kuv yuav pom qhov chaw no ua dab tsi thiab, yog tias ua tau, kuv yuav ntxuav qhov chaw.
Tom qab ntawd tus neeg xam phaj nug, yuav ua li cas yog tias tsis muaj qhov chaw pub dawb ntawm qhov muab faib, tab sis koj kuj tsis pom cov ntaub ntawv uas yuav siv tag nrho qhov chaw?

Txog qhov no, kuv tau hais tias koj tuaj yeem saib cov ntaub ntawv qhib txhua lub sijhawm, piv txwv li, nrog lsof hais kom ua thiab nkag siab tias daim ntawv thov twg tau siv tag nrho cov chaw muaj, thiab tom qab ntawd koj tuaj yeem ua raws li qhov xwm txheej, nyob ntawm seb cov ntaub ntawv xav tau. .

Tus neeg xam phaj cuam tshuam kuv ntawm lo lus kawg, ntxiv rau nws cov lus nug: "Xav tias peb tsis xav tau cov ntaub ntawv, nws tsuas yog lub cav debug, tab sis daim ntawv thov poob vim nws tsis tuaj yeem sau qhov kev debug"?

"ok," Kuv teb tias, "peb tuaj yeem tua kev debugging hauv daim ntawv thov config thiab rov pib dua."
Tus neeg xam phaj tau tawm tsam: "Tsis yog, peb tsis tuaj yeem rov pib dua daim ntawv thov, peb tseem muaj cov ntaub ntawv tseem ceeb hauv kev nco, thiab cov neeg siv khoom tseem ceeb txuas nrog rau qhov kev pabcuam nws tus kheej, uas peb tsis tuaj yeem yuam kom rov txuas dua."

"ok," Kuv hais tias, "yog tias peb tsis tuaj yeem rov pib dua daim ntawv thov thiab peb tsis quav ntsej txog cov ntaub ntawv, ces peb tuaj yeem tshem tawm cov ntaub ntawv qhib no ntawm tus sau cov ntaub ntawv, txawm tias peb tsis pom nws hauv ls. hais kom ua ntawm cov ntaub ntawv system. "

Tus neeg xam phaj tau txaus siab, tab sis kuv tsis yog.

Tom qab ntawd kuv xav tias, vim li cas tus neeg tsis kuaj kuv qhov kev paub khawb tob? Tab sis yuav ua li cas yog tias cov ntaub ntawv tseem ceeb tom qab tag nrho? Yuav ua li cas yog tias peb tsis tuaj yeem rov pib txheej txheem, thiab tib lub sijhawm cov txheej txheem no sau rau hauv cov ntaub ntawv kaw lus ntawm qhov muab faib uas tsis muaj qhov chaw dawb? Yuav ua li cas yog tias peb tsis tuaj yeem poob tsis tsuas yog cov ntaub ntawv uas twb tau sau lawm, tab sis kuj yog cov ntaub ntawv uas cov txheej txheem no sau lossis sim sau?

Tuzik

Thaum pib ntawm kuv txoj haujlwm, kuv tau sim tsim ib daim ntawv thov me me uas yuav tsum tau khaws cov ntaub ntawv hais txog cov neeg siv. Thiab ces kuv xav, yuav ua li cas kuv phim tus neeg siv rau nws cov ntaub ntawv. Piv txwv li, kuv muaj Ivanov Ivan Ivanovich, thiab nws muaj ib co ntaub ntawv, tab sis yuav ua li cas ua phooj ywg nrog lawv? Kuv tuaj yeem taw qhia ncaj qha tias tus dev hu ua "Tuzik" belongs rau tib Ivan. Tab sis yuav ua li cas yog tias nws hloov nws lub npe thiab hloov Ivan ua, piv txwv li, Olya? Tom qab ntawd nws yuav tig tawm tias peb Olya Ivanovna Ivanova yuav tsis muaj ib tug dev, thiab peb Tuzik tseem yuav yog tus uas tsis muaj nyob hauv Ivan. Cov ntaub ntawv tau pab daws qhov teeb meem no, uas tau muab rau txhua tus neeg siv tus cim tshwj xeeb (ID), thiab kuv Tuzik tau khi rau tus ID no, qhov tseeb, tsuas yog tus lej xov tooj xwb. Yog li, tus tswv ntawm tuzik tau nrog tus lej ID 2, thiab nyob rau qee lub sijhawm Ivan nyob hauv daim ID no, thiab tom qab ntawd Olya los ua tus ID tib yam. Qhov teeb meem ntawm noob neej thiab tsiaj ua liaj ua teb tau ua tiav.

Cov ntaub ntawv piav qhia

Qhov teeb meem ntawm cov ntaub ntawv thiab cov kev pab cuam uas ua haujlwm nrog cov ntaub ntawv no yog hais txog tib yam li peb tus dev thiab tib neeg. Piv txwv tias kuv qhib ib cov ntaub ntawv npe hu ua ivan.txt thiab pib sau lo lus tuzik rau hauv nws, tab sis tswj kom sau tsuas yog thawj tsab ntawv "t" rau hauv cov ntaub ntawv, thiab cov ntaub ntawv no tau hloov npe los ntawm ib tug neeg, piv txwv li, rau olya.txt. Tab sis cov ntaub ntawv yog tib yam thiab kuv tseem xav sau kuv ace rau nws. Txhua zaus koj qhib cov ntaub ntawv nrog lub kaw lus hu qhib nyob rau hauv txhua yam lus programming, kuv tau txais ib tus ID tshwj xeeb uas taw qhia kuv rau ib cov ntaub ntawv, tus ID no yog cov ntaub ntawv piav qhia. Thiab nws tsis muaj teeb meem dab tsi thiab leej twg ua ntxiv nrog cov ntaub ntawv no, nws tuaj yeem raug tshem tawm, nws tuaj yeem hloov npe, nws tuaj yeem hloov nws tus tswv lossis tshem tawm txoj cai los nyeem thiab sau, Kuv tseem yuav nkag mus rau nws, vim tias thaum lub sijhawm qhib cov ntaub ntawv kuv muaj cai nyeem thiab / lossis sau nws thiab kuv tau tswj kom pib ua haujlwm nrog nws, uas txhais tau hais tias kuv yuav tsum tau ua ntxiv mus.

Ntawm Linux, lub tsev qiv ntawv libc qhib 3 cov ntaub ntawv piav qhia rau txhua daim ntawv thov khiav (txheej txheem), nrog cov lej 0,1,2. Xav paub ntau ntxiv koj tuaj yeem nrhiav tau ntawm qhov txuas tus stdio ΠΈ tus stdout

  • Cov ntaub ntawv piav qhia 0 yog hu ua STDIN thiab cuam tshuam nrog cov ntawv thov nkag.
  • Cov ntaub ntawv piav qhia 1 yog hu ua STDOUT thiab yog siv los ntawm cov ntawv tso zis xws li cov lus txib luam tawm.
  • Cov ntaub ntawv piav qhia 2 yog lub npe STDERR thiab siv los ntawm cov ntawv thov los tso tawm cov lus yuam kev.

Yog tias hauv koj qhov program koj qhib cov ntawv nyeem lossis sau ntawv, feem ntau koj yuav tau txais thawj tus ID dawb thiab nws yuav yog tus lej 3.

Koj tuaj yeem pom cov npe ntawm cov ntaub ntawv piav qhia rau txhua tus txheej txheem yog tias koj paub nws PID.

Piv txwv li, cia peb qhib lub console nrog bash thiab pom PID ntawm peb cov txheej txheem

[user@localhost ]$ echo $$
15771

Hauv qhov thib ob console, khiav

[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

Koj tuaj yeem tsis quav ntsej cov ntaub ntawv piav qhia nrog tus lej 255 nyob rau hauv lub moj khaum ntawm tsab xov xwm no, nws tau qhib rau koj cov kev xav tau los ntawm bash nws tus kheej, thiab tsis yog los ntawm cov tsev qiv ntawv txuas.

Tam sim no tag nrho 3 cov ntaub ntawv piav qhia yog txuam nrog pseudo-terminal ntaus ntawv /dev/pts, tab sis peb tseem tuaj yeem tswj hwm lawv, piv txwv li, khiav hauv lub console thib ob

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

Thiab nyob rau hauv thawj console peb yuav pom

[user@localhost ]$ hello world

Redirect thiab yeeb nkab

Koj tuaj yeem yooj yim hla cov 3 cov ntaub ntawv piav qhia hauv txhua txoj kev, suav nrog hauv bash, piv txwv li, los ntawm cov yeeb nkab (pipe) txuas ob txheej txheem, saib

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

Koj tuaj yeem khiav qhov lus txib no koj tus kheej nrog rov -f thiab pom dab tsi tshwm sim hauv, tab sis kuv yuav ua kom luv luv.

Peb niam txiv bash txheej txheem nrog PID 15771 parses peb cov lus txib thiab nkag siab raws nraim pes tsawg cov lus txib peb xav khiav, hauv peb rooj plaub muaj ob ntawm lawv: miv thiab pw tsaug zog. Bash paub tias nws yuav tsum tsim kom muaj ob txoj hauv kev me me, thiab muab tso rau hauv ib lub yeeb nkab. Nyob rau hauv tag nrho, bash yuav xav tau 2 tus me nyuam cov txheej txheem thiab ib lub yeeb nkab.

Ua ntej tsim cov txheej txheem me nyuam, bash khiav lub kaw lus hu yeeb nkab thiab tau txais cov ntaub ntawv tshiab piav qhia ntawm cov yeeb nkab tsis tu ncua ib ntus, tab sis qhov tsis zoo no tseem tsis tau txuas rau peb ob tus menyuam cov txheej txheem hauv txhua txoj kev.

Rau cov txheej txheem niam txiv, nws zoo li cov yeeb nkab twb muaj lawm, tab sis tseem tsis tau muaj cov txheej txheem menyuam yaus:

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

Tom qab ntawd siv qhov system hu clone bash tsim ob txheej txheem me nyuam, thiab peb cov txheej txheem yuav zoo li no:

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

Tsis txhob hnov ​​​​qab tias clone clones cov txheej txheem nrog rau tag nrho cov ntaub ntawv piav qhia, yog li lawv yuav zoo ib yam hauv cov txheej txheem niam txiv thiab cov menyuam. Lub luag haujlwm ntawm cov txheej txheem niam txiv nrog PID 15771 yog saib xyuas cov txheej txheem ntawm tus menyuam, yog li nws tsuas yog tos cov lus teb los ntawm cov menyuam yaus.

Yog li ntawd, nws tsis xav tau cov yeeb nkab, thiab nws kaw cov ntaub ntawv piav qhia nrog tus lej 3 thiab 4.

Hauv thawj bash tus txheej txheem me nyuam nrog PID 9004, lub kaw lus hu ua dup2, hloov peb cov ntaub ntawv STDOUT tus naj npawb 1 mus rau cov ntaub ntawv piav qhia taw qhia rau cov yeeb nkab, hauv peb cov ntaub ntawv nws yog tus lej 3. Yog li, txhua yam uas thawj tus menyuam txheej txheem nrog PID 9004 sau rau STDOUT yuav cia li poob rau hauv cov yeeb nkab tsis.

Hauv cov txheej txheem menyuam thib ob nrog PID 9005, bash dup2s cov ntaub ntawv mus rau STDIN descriptor number 0. Tam sim no txhua yam uas peb thib ob bash nrog PID 9005 yuav nyeem yuav nyeem los ntawm cov yeeb nkab.

Tom qab ntawd, cov ntaub ntawv piav qhia nrog tus lej 3 thiab 4 kuj raug kaw hauv cov txheej txheem menyuam yaus, vim lawv tsis siv lawm.

Kuv txhob txwm tsis quav ntsej cov ntaub ntawv descriptor 255, nws yog siv sab hauv los ntawm bash nws tus kheej thiab tseem yuav raug kaw hauv cov txheej txheem menyuam yaus.

Tom ntej no, hauv thawj tus menyuam txheej txheem nrog PID 9004, bash pib nrog kev hu xovtooj exec cov ntaub ntawv executable uas peb teev rau ntawm kab hais kom ua, hauv peb rooj plaub nws yog /usr/bin/cat.

Hauv cov txheej txheem menyuam thib ob nrog PID 9005, bash ua haujlwm thib ob peb tau teev tseg, hauv peb rooj plaub / usr / bin / pw tsaug zog.

Tus exec system hu tsis kaw cov ntaub ntawv piav qhia tshwj tsis yog lawv tau qhib nrog O_CLOEXEC chij thaum lub sijhawm qhib hu raug tua. Hauv peb cov ntaub ntawv, tom qab khiav cov ntaub ntawv executable, tag nrho cov ntaub ntawv piav qhia tam sim no yuav raug cawm.

Tshawb xyuas hauv 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

Raws li koj tuaj yeem pom, tus naj npawb tshwj xeeb ntawm peb cov yeeb nkab yog tib yam hauv ob txoj kev. Yog li, peb muaj kev sib txuas ntawm ob txoj kev sib txawv nrog tib tus niam txiv.

Rau cov neeg uas tsis paub txog lub kaw lus hu uas siv bash, kuv xav kom khiav cov lus txib los ntawm txoj kab thiab pom dab tsi tshwm sim hauv, piv txwv li, zoo li qhov no:

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

Cia peb rov qab mus rau peb qhov teeb meem nrog khiav tawm ntawm qhov chaw disk thiab sim txuag cov ntaub ntawv yam tsis tau rov pib dua txheej txheem. Cia peb sau ib qho kev pab cuam me me uas yuav sau rau disk txog 1 megabyte ib ob. Ntxiv mus, yog tias vim li cas peb tsis tuaj yeem sau cov ntaub ntawv rau disk, peb tsuas yog tsis quav ntsej qhov no thiab sim sau cov ntaub ntawv dua hauv ib pliag. Hauv qhov piv txwv kuv siv Python, koj tuaj yeem siv lwm yam lus programming.

[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

Khiav qhov program thiab saib cov ntaub ntawv piav qhia

[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

Raws li koj tuaj yeem pom, peb muaj peb tus qauv 3 cov ntaub ntawv piav qhia thiab lwm qhov uas peb tau qhib. Cia peb kuaj cov ntaub ntawv loj:

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

cov ntaub ntawv yog sau, peb sim hloov txoj cai rau cov ntaub ntawv:

[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

Peb pom tias cov ntaub ntawv tseem tab tom sau, txawm tias peb cov neeg siv tsis muaj cai sau rau hauv cov ntaub ntawv. Cia peb sim tshem nws:

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

Cov ntaub ntawv sau nyob qhov twg? Thiab lawv puas tau sau tag nrho? Peb kuaj:

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

Yog lawm, peb cov ntaub ntawv piav qhia tseem muaj, thiab peb tuaj yeem ua haujlwm nrog cov ntaub ntawv piav qhia zoo li peb cov ntaub ntawv qub, peb tuaj yeem nyeem nws, ntxuav nws thiab luam tawm.

Saib cov ntaub ntawv loj:

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

Cov ntaub ntawv loj yog 19923457. Sim tshem cov ntaub ntawv:

[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

Raws li koj tuaj yeem pom, cov ntaub ntawv loj tsuas yog nce thiab peb lub cev tsis ua haujlwm. Cia peb tig mus rau cov ntaub ntawv ntawm kev hu xov tooj qhib. Yog tias peb siv tus chij O_APPEND thaum qhib cov ntaub ntawv, tom qab ntawd nrog txhua tus sau, lub operating system xyuas cov ntaub ntawv loj thiab sau cov ntaub ntawv mus rau qhov kawg ntawm cov ntaub ntawv, thiab ua nws atomically. Qhov no tso cai rau ntau lub xov lossis cov txheej txheem sau rau tib cov ntaub ntawv. Tab sis hauv peb txoj cai peb tsis siv tus chij no. Peb tuaj yeem pom cov ntaub ntawv sib txawv hauv lsof tom qab lub cev tsuas yog peb qhib cov ntaub ntawv rau kev sau ntawv, uas txhais tau hais tias hauv peb cov cai, tsis yog

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

peb yuav tsum tso

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

Kos nrog "w" chij

[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

thiab nrog "a" chij

[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

Programming tus txheej txheem uas twb muaj lawm

Feem ntau, thaum tsim thiab sim ib qhov kev pab cuam, programmers siv debuggers (piv txwv li, GDB) lossis ntau theem ntawm kev nkag rau hauv daim ntawv thov. Linux muab lub peev xwm los sau thiab hloov qhov kev pab cuam uas twb tau ua lawm, xws li hloov cov txiaj ntsig ntawm kev hloov pauv, teeb tsa lub sijhawm tawg, thiab lwm yam.

Rov qab mus rau thawj lo lus nug txog qhov tsis muaj qhov chaw disk los sau cov ntaub ntawv, cia peb sim simulate qhov teeb meem.

Cia peb tsim ib cov ntaub ntawv rau peb muab faib, uas peb yuav mount raws li ib tug cais tsav:

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

Cia peb tsim cov ntaub ntawv 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 ~]$

Cia peb mount cov ntaub ntawv 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

Tsim ib daim ntawv teev npe nrog peb tus tswv:

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

Cia peb qhib cov ntaub ntawv rau kev sau ntawv nkaus xwb hauv peb qhov program:

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

Tua tawm

[user@localhost ]$ python openforwrite.py 

Tos ob peb feeb

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

Yog li, peb tau txais qhov teeb meem tau piav qhia thaum pib ntawm tsab xov xwm no. Qhov chaw dawb 0, nyob 100%.

Peb nco ntsoov tias raws li cov xwm txheej ntawm qhov teeb meem, peb tab tom sim sau cov ntaub ntawv tseem ceeb heev uas tsis tuaj yeem ploj. Thiab ua li ntawd, peb yuav tsum kho qhov kev pabcuam yam tsis tau rov pib dua txheej txheem.

Cia peb hais tias peb tseem muaj qhov chaw disk, tab sis nyob rau hauv ib qho kev faib sib txawv, piv txwv li, hauv / tsev.

Cia peb sim "reprogram ntawm ya" peb cov cai.

Peb saib PID ntawm peb cov txheej txheem, uas noj tag nrho cov chaw 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

Txuas rau cov txheej txheem nrog gdb

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

Peb saib qhib cov ntaub ntawv piav qhia:

(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

Peb saib cov ntaub ntawv hais txog cov ntaub ntawv piav qhia nrog tus lej 3, uas peb nyiam

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

Nco ntsoov tias lub kaw lus hu ua Python ua li cas (saib saum toj no qhov twg peb tau khiav strace thiab pom qhov qhib hu), thaum ua peb cov cai qhib cov ntaub ntawv, peb ua tib yam rau peb tus kheej rau peb tus txheej txheem, tab sis peb xav tau O_WRONLY|O_CREAT| O_TRUNC cov khoom hloov nrog tus lej tus nqi. Ua li no, qhib lub kernel qhov chaw, piv txwv li S, SΡ“S, thiab saib cov chij twg yog lub luag haujlwm rau dab tsi

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

Peb muab tag nrho cov txiaj ntsig \u00001101b\uXNUMXbinto ib qho, peb tau txais XNUMX

Khiav peb hu los ntawm gdb

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

Yog li peb tau txais cov ntaub ntawv tshiab nrog tus lej 4 thiab cov ntaub ntawv qhib tshiab ntawm lwm qhov muab faib, kos:

(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

Peb nco ntsoov qhov piv txwv nrog cov yeeb nkab - yuav ua li cas bash hloov cov ntaub ntawv piav qhia, thiab twb tau kawm txog kev hu xov tooj rau dup2.

Sim hloov ib daim ntawv piav qhia nrog lwm tus

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

Peb tshawb xyuas:

(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

Kaw cov ntaub ntawv piav qhia 4, vim peb tsis xav tau nws:

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

Thiab tawm 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

Tshawb xyuas cov ntaub ntawv tshiab:

[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

Raws li koj tuaj yeem pom, cov ntaub ntawv tau sau rau hauv cov ntaub ntawv tshiab, peb tshawb xyuas qhov qub:

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

Cov ntaub ntawv tsis ploj, daim ntawv thov ua haujlwm, cov ntawv teev lus tau sau rau qhov chaw tshiab.

Cia peb ua tej yam nyuaj me ntsis

Xav txog tias cov ntaub ntawv tseem ceeb rau peb, tab sis peb tsis muaj qhov chaw disk hauv ib qho ntawm cov partitions thiab peb tsis tuaj yeem txuas lub disk.

Qhov peb tuaj yeem ua tau yog redirect peb cov ntaub ntawv nyob qhov twg, piv txwv li, mus rau ib lub yeeb nkab, thiab redirect cov ntaub ntawv los ntawm cov yeeb nkab mus rau lub network los ntawm ib co kev pab cuam, xws li netcat.
Peb tuaj yeem tsim lub npe yeeb nkab nrog mkfifo hais kom ua. Nws yuav tsim cov ntaub ntawv pseudo ntawm cov ntaub ntawv kaw lus, txawm tias tsis muaj qhov chaw dawb ntawm nws.

Pib dua daim ntawv thov thiab kos:

[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

Tsis muaj qhov chaw disk, tab sis peb ua tiav tsim cov yeeb nkab muaj npe nyob ntawd:

[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

Tam sim no peb yuav tsum tau qhwv tag nrho cov ntaub ntawv uas nkag mus rau hauv cov yeeb nkab no mus rau lwm tus neeg rau zaub mov los ntawm lub network, tib netcat tsim nyog rau qhov no.

Ntawm cov chaw taws teeb-server.example.com server, khiav

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

Ntawm peb qhov teeb meem server, khiav hauv ib lub davhlau ya nyob twg

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

Tam sim no tag nrho cov ntaub ntawv uas nkag mus rau hauv cov yeeb nkab yuav cia li mus rau stdin hauv netcat, uas yuav xa mus rau lub network ntawm chaw nres nkoj 7777.

Txhua yam peb yuav tsum tau ua yog pib sau peb cov ntaub ntawv mus rau lub npe yeeb nkab no.

Peb twb muaj ib daim ntawv thov khiav:

[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

Ntawm tag nrho cov chij, peb tsuas yog xav tau O_WRONLY txij li cov ntaub ntawv twb muaj lawm thiab peb tsis tas yuav tshem nws

[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

Tshawb xyuas cov chaw taws teeb chaw taws teeb remote-server.example.com

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

Cov ntaub ntawv tuaj, peb xyuas cov teeb meem 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

Cov ntaub ntawv tau txais kev cawmdim, qhov teeb meem raug daws.

Kuv siv lub sijhawm no los hais nyob zoo rau kuv cov npoj yaig los ntawm Degiro.
Mloog xov tooj cua-T podcasts.

Txhua yam zoo.

Raws li kev ua haujlwm tom tsev, kuv thov kom xav txog dab tsi yuav muaj nyob rau hauv cov ntaub ntawv piav qhia ntawm tus miv thiab cov txheej txheem pw tsaug zog yog tias koj khiav cov lus txib hauv qab no:

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

Tau qhov twg los: www.hab.com

Ntxiv ib saib