Mea wehewehe waihona ma Linux me nā laʻana

I kekahi manawa, i ka wā o kahi ninaninau, ua nīnau ʻia iaʻu, he aha kāu e hana ai inā ʻike ʻoe i kahi lawelawe ʻaʻole e hana ma muli o ka pau ʻana o ka diski?

ʻOiaʻiʻo, ua pane wau e ʻike wau i ka mea i noho ʻia e kēia wahi a inā hiki, e hoʻomaʻemaʻe wau i kēlā wahi.
A laila, nīnau ka mea nīnau nīnau, pehea inā ʻaʻohe wahi kaʻawale ma ka pā, akā ʻaʻole ʻoe e ʻike i nā faila e lawe i nā wahi āpau?

I kēia mea au i ʻōlelo ai hiki iā ʻoe ke nānā mau i nā wehewehe faila wehe, no ka laʻana me ke kauoha lsof, a hoʻomaopopo i ka noi i lawe i nā wahi āpau i loaʻa, a laila hiki iā ʻoe ke hana e like me nā kūlana, e pili ana i ka pono o ka ʻikepili. .

Ua hoʻopau ka mea nīnau nīnau iaʻu ma ka ʻōlelo hope loa, me ka hoʻohui ʻana i kāna nīnau: "Inā ʻaʻole pono mākou i ka ʻikepili, he log debug wale nō, akā ʻaʻole hana ka noi no ka mea hiki ʻole ke kākau i kahi debug"?

"ʻAe," i pane aku ai au, "hiki iā mākou ke hoʻopau i ka debug i ka config noi a hoʻomaka hou."
Ua kūʻē ka mea nīnau nīnau: "ʻAʻole, ʻaʻole hiki iā mākou ke hoʻomaka hou i ka noi, aia nō mākou i nā ʻikepili koʻikoʻi i mālama ʻia i ka hoʻomanaʻo, a pili nā mea kūʻai aku koʻikoʻi i ka lawelawe ponoʻī, ʻaʻole hiki iā mākou ke koi e hoʻohui hou."

"ʻAe," wahi aʻu, "inā ʻaʻole hiki iā mākou ke hoʻomaka hou i ka noi a ʻaʻole koʻikoʻi ka ʻikepili iā mākou, a laila hiki iā mākou ke hoʻomaʻemaʻe i kēia faila wehe ma o ka file descriptor, ʻoiai inā ʻaʻole mākou e ʻike iā ia ma ke kauoha ls. ma ka ʻōnaehana faila."

Ua hauʻoli ka mea nīnau nīnau, akā ʻaʻole wau.

A laila, noʻonoʻo wau, no ke aha i ʻeli hohonu ʻole ai ka mea hoʻāʻo i koʻu ʻike? Akā, pehea inā he mea nui ka ʻikepili ma hope o nā mea a pau? He aha inā ʻaʻole hiki iā mākou ke hoʻomaka hou i kahi kaʻina hana, a kākau ke kaʻina i ka ʻōnaehana faila ma kahi ʻāpana ʻaʻohe wahi kaʻawale? He aha inā ʻaʻole hiki iā mākou ke nalowale ʻaʻole wale ka ʻikepili i kākau mua ʻia, akā ʻo ka ʻikepili hoʻi i kākau ai kēia kaʻina hana a hoʻāʻo paha e kākau?

Tuzik

I ka hoʻomaka ʻana o kaʻu ʻoihana, ua hoʻāʻo wau e hana i kahi noi liʻiliʻi e pono e mālama i ka ʻike mea hoʻohana. A laila noʻonoʻo wau, pehea wau e hoʻohālikelike ai i ka mea hoʻohana i kāna ʻikepili. No ka laʻana, loaʻa iaʻu ʻo Ivanov Ivan Ivanovich, a loaʻa iā ia kekahi mau ʻike, akā pehea wau e launa pū ai me lākou? Hiki iaʻu ke kuhikuhi pololei i ka ʻīlio i kapa ʻia ʻo "Tuzik" no kēia ʻIvana. Akā pehea inā e hoʻololi ʻo ia i kona inoa a ma kahi o Ivan e lilo, no ka laʻana, ʻo Olya? A laila e ʻike ʻia ʻaʻole e loaʻa hou kā mākou Olya Ivanovna Ivanova i kahi ʻīlio, a ʻo kā mākou Tuzik e pili ana i ka ʻIvana ʻole. ʻO kahi waihona i hāʻawi i kēlā me kēia mea hoʻohana i kahi ʻike kūʻokoʻa (ID) i kōkua i ka hoʻoponopono ʻana i kēia pilikia, a ua hoʻopaʻa ʻia koʻu Tuzik i kēia ID, ʻo ia hoʻi, he helu serial wale nō. No laila, ua loaʻa i ka mea nona ka ace ka helu ID 2, a i kekahi manawa aia ʻo Ivan ma lalo o kēia ID, a laila lilo ʻo Olya ma lalo o ka ID like. Ua hoʻoponopono ʻia ka pilikia o ke kanaka a me ka mahi holoholona.

Mea wehewehe waihona

ʻO ka pilikia o ka faila a me ka papahana e hana pū ana me kēia faila ua like ia me kā mākou ʻīlio a me ke kanaka. Inā paha ua wehe au i kahi faila i kapa ʻia ʻo ivan.txt a hoʻomaka wau e kākau i ka huaʻōlelo tuzik i loko, akā ua hoʻokō wale wau e kākau i ka leka mua "t" i loko o ka faila, a ua kapa hou ʻia kēia faila e kekahi, no ka laʻana, i olya.txt. Akā mau ka faila, a makemake au e hoʻopaʻa i kaʻu ace i loko. I kēlā me kēia manawa e wehe ʻia kahi faila e kahi kelepona ʻōnaehana hamama ma kekahi ʻōlelo hoʻolālā e loaʻa iaʻu kahi ID kūʻokoʻa e kuhikuhi iaʻu i kahi faila, ʻo kēia ID ka wehewehe faila. A ʻaʻohe mea pili i ka mea a me ka mea e hana me kēia faila ma hope, hiki ke holoi ʻia, hiki ke hoʻololi i ka inoa, hiki ke hoʻololi ʻia ka mea nona, a i ʻole e lawe ʻia nā kuleana heluhelu a kākau, e loaʻa mau iaʻu. iā ia, no ka mea, i ka manawa o ka wehe ʻana i ka faila, ua loaʻa iaʻu nā kuleana e heluhelu a/a kākau paha a hoʻomaka wau e hana me ia, ʻo ia hoʻi, pono wau e hoʻomau i ka hana.

Ma Linux, wehe ka waihona libc i nā faila wehewehe 3 no kēlā me kēia noi holo (ka hana), helu ʻia 0,1,2. Hiki ke loaʻa ka ʻike hou aku ma nā loulou kanaka stdio и kanaka stdout

  • Ua kapa ʻia ʻo STDIN wehewehe faila 0 a pili pū me ka hoʻokomo noi
  • Ua kapa ʻia ʻo STDOUT ka wehewehe faila 1 a hoʻohana ʻia e nā noi e hoʻopuka i ka ʻikepili, e like me nā kauoha paʻi
  • Ua kapa ʻia ʻo STDERR ka wehewehe faila 2 a hoʻohana ʻia e nā noi e hoʻopuka i nā memo hewa.

Inā ma kāu polokalamu e wehe ʻoe i kekahi faila no ka heluhelu ʻana a i ʻole ke kākau ʻana, a laila e loaʻa iā ʻoe ka ID manuahi mua a ʻo ia ka helu 3.

Hiki ke nānā ʻia ka papa inoa o nā faila wehewehe no kekahi kaʻina hana inā ʻike ʻoe i kāna PID.

No ka laʻana, e wehe kākou i ka console bash a nānā i ka PID o kā mākou hana

[user@localhost ]$ echo $$
15771

I ka lua o ka console e holo kakou

[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

Hiki iā ʻoe ke haʻalele palekana i ka helu wehewehe faila 255 no nā kumu o kēia ʻatikala; ua wehe ʻia no kona pono e ka bash ponoʻī, ʻaʻole na ka waihona pili.

I kēia manawa, pili nā faila descriptor 3 me ka mea hoʻohana pseudo terminal /dev/pts, akā hiki iā mākou ke hoʻololi iā lākou, no ka laʻana, holo iā lākou i kahi console lua

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

A ma ka console mua mākou e ʻike ai

[user@localhost ]$ hello world

Redirect a me ka paipu

Hiki iā ʻoe ke hoʻopau maʻalahi i kēia mau faila descriptor 3 i kekahi kaʻina hana, me ka bash, no ka laʻana ma o kahi paipu e hoʻopili ana i nā kaʻina ʻelua, ʻike.

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

Hiki iā ʻoe ke holo i kēia kauoha iā ʻoe iho me strace -f a ʻike i nā mea e hana nei i loko, akā e haʻi pōkole wau iā ʻoe.

ʻO kā mākou papa hana bash makua me PID 15771 e hoʻopau i kā mākou kauoha a hoʻomaopopo pono i ka nui o nā kauoha a mākou e makemake ai e holo, i kā mākou hihia aia ʻelua o lākou: ka pōpoki a me ka hiamoe. Ua ʻike ʻo Bash he pono ia e hana i ʻelua kaʻina keiki, a hoʻohui iā lākou i hoʻokahi paipu. I ka huina, pono ka bash i 2 kaʻina keiki a me hoʻokahi paipu.

Holo ʻo Bash i kahi kelepona ʻōnaehana ma mua o ka hana ʻana i nā kaʻina hana keiki paipu a loaʻa i nā mea wehewehe faila hou ma ka paipu hoʻopaʻa manawaleʻa, akā ʻaʻole i hoʻopili kēia paʻa i kā mākou mau hana keiki ʻelua.

No ke kaʻina hana makua, me he mea lā aia he paipu, akā ʻaʻohe hana keiki i kēia manawa:

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

A laila e hoʻohana i ke kelepona ʻōnaehana clone hana ʻo bash i ʻelua kaʻina hana keiki, a ʻo kā mākou kaʻina hana ʻekolu e like me kēia:

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

Mai poina i ka clone clone i ke kaʻina hana me nā mea wehewehe faila a pau, no laila e like lākou ma ke kaʻina hana makua a me nā keiki. ʻO ka hana o ke kaʻina hana makua me PID 15771 ka nānā ʻana i nā kaʻina keiki, no laila ke kali wale nei i ka pane mai nā keiki.

No laila, ʻaʻole pono ia i ka paipu, a pani ʻo ia i nā mea wehewehe faila helu 3 a me 4.

Ma ke kaʻina hana bash keiki mua me PID 9004, ke kelepona pūnaewele dup2, hoʻololi i kā mākou STDOUT file descriptor number 1 i kahi faila descriptor e kuhikuhi ana i ka paipu, i kā mākou hihia ʻo ia ka helu 3. No laila, ʻo nā mea a pau a ke kaʻina hana keiki mua me PID 9004 e kākau ai iā STDOUT e hoʻopau ʻokoʻa i ka paipu paipu.

Ma ke kaʻina hana lua o ke keiki me PID 9005, hoʻohana ka bash i ka dup2 e hoʻololi i ka wehewehe faila STDIN helu 0. I kēia manawa e heluhelu ʻia nā mea a pau a kā mākou lua bash me PID 9005 e heluhelu ʻia mai ka paipu.

Ma hope o kēia, ua pani ʻia nā mea wehewehe faila helu 3 a me 4 i nā kaʻina keiki, no ka mea ʻaʻole i hoʻohana hou ʻia.

Hoʻokaʻawale wau i ka faila descriptor 255; hoʻohana ʻia ia no ka hana kūloko e ka bash ponoʻī a pani ʻia hoʻi i nā kaʻina keiki.

A laila, i ke kaʻina hana keiki mua me PID 9004, hoʻomaka ka bash e hoʻohana i kahi kelepona ʻōnaehana exec ka faila hoʻokō a mākou i kuhikuhi ai ma ka laina kauoha, i kā mākou hihia ʻo ia /usr/bin/cat.

Ma ke kaʻina hana lua o ke keiki me PID 9005, holo ka bash i ka lua o ka hoʻokō a mākou i kuhikuhi ai, i kā mākou hihia /usr/bin/sleep.

ʻAʻole pani ka ʻōnaehana exec i nā lima waihona ke ʻole lākou i wehe ʻia me ka hae O_CLOEXEC i ka manawa i kāhea ʻia ai ke kelepona wehe. I kā mākou hihia, ma hope o ka hoʻokuʻu ʻana i nā faila hiki ke hoʻokō ʻia, e mālama ʻia nā mea wehewehe faila āpau.

E nānā i ka 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

E like me kāu e ʻike ai, ua like ka helu kūʻokoʻa o kā mākou paipu i nā kaʻina ʻelua. No laila, loaʻa iā mākou kahi pilina ma waena o nā kaʻina hana ʻelua me ka makua hoʻokahi.

No ka poʻe ʻike ʻole i ka ʻōnaehana kelepona i hoʻohana ʻia e bash, makemake nui wau e holo i nā kauoha ma o strace a ʻike i nā mea e hana nei i loko, e like me kēia:

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

E hoʻi kāua i kā mākou pilikia o ka pau ʻana o ka wahi disk a me ka hoʻāʻo e mālama i ka ʻikepili me ka ʻole e hoʻomaka hou i ke kaʻina hana. E kākau i kahi papahana liʻiliʻi e kākau ma kahi o 1 megabyte i kekona i ka disk. Eia kekahi, inā no kekahi kumu ʻaʻole hiki iā mākou ke kākau i ka ʻikepili i ka disk, e haʻalele wale mākou i kēia a hoʻāʻo e kākau hou i ka ʻikepili i kekona. Ma ka laʻana aʻu e hoʻohana nei i ka Python, hiki iā ʻoe ke hoʻohana i kekahi ʻōlelo papahana ʻē aʻe.

[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

E holo kāua i ka papahana a nānā i nā mea wehewehe faila

[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

E like me kāu e ʻike ai, loaʻa iā mākou kā mākou mau wehewehe faila maʻamau 3 a me kahi mea hou aʻe a mākou i wehe ai. E nānā kākou i ka nui o ka faila:

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

Ke kākau ʻia nei ka ʻikepili, hoʻāʻo mākou e hoʻololi i nā ʻae i ka faila:

[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

ʻIke mākou e kākau ʻia ana ka ʻikepili, ʻoiai ʻaʻole ʻae ʻia kā mākou mea hoʻohana e kākau i ka faila. E ho'āʻo kākou e wehe:

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

Aia i hea ka ʻikepili i kākau ʻia? A ua kakauia anei lakou? Nānā mākou:

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

ʻAe, ke mau nei kā mākou wehewehe wehewehe faila a hiki iā mākou ke hana i kēia wehewehe wehewehe e like me kā mākou faila kahiko, hiki iā mākou ke heluhelu, holoi a kope.

E nānā kākou i ka nui o ka faila:

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

ʻO 19923457 ka nui o ka faila. E hoʻāʻo kākou e holoi i ka faila:

[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

E like me kāu e ʻike ai, ke hoʻonui wale nei ka nui o ka faila a ʻaʻole i hana kā mākou pahu. E nānā kākou i ka palapala kelepona pūnaewele hamama. Inā hoʻohana mākou i ka hae O_APPEND i ka wā e wehe ai i kahi faila, a laila me kēlā me kēia kākau ʻana, nānā ka ʻōnaehana hana i ka nui o ka faila a kākau i ka ʻikepili i ka hope loa o ka faila, a hana i kēia atomically. ʻAe kēia i nā loina a i ʻole kaʻina hana e kākau i ka faila hoʻokahi. Akā i kā mākou code ʻaʻole mākou e hoʻohana i kēia hae. Hiki iā mākou ke ʻike i kahi faila ʻē aʻe ma lsof ma hope o ka pahu wale nō inā wehe mākou i ka faila no ke kākau hou ʻana, ʻo ia hoʻi ma kā mākou code.

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

pono mākou e kau

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

Ke nānā nei me ka hae "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

a me ka hae "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

Hoʻolālā i kahi kaʻina hana e holo nei

Hoʻohana pinepine nā polokalamu polokalamu, i ka hana ʻana a me ka hoʻāʻo ʻana i nā polokalamu, hoʻohana i nā debuggers (no ka laʻana GDB) a i ʻole nā ​​pae like ʻole o ke komo ʻana i ka noi. Hāʻawi ʻo Linux i ka hiki ke kākau maoli a hoʻololi i kahi papahana e holo nei, no ka laʻana, hoʻololi i nā waiwai o nā loli, hoʻonohonoho i kahi breakpoint, etc., etc.

Ke hoʻi nei i ka nīnau kumu e pili ana i ka lawa ʻole o ka wahi disk e kākau ai i kahi faila, e hoʻāʻo kākou e hoʻohālikelike i ka pilikia.

E hana mākou i faila no kā mākou ʻāpana, a mākou e kau ai ma ke ʻano he disk kaʻawale:

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

E hana kākou i ʻōnaehana faila:

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

E kau i ka ʻōnaehana waihona:

[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

Hana mākou i papa kuhikuhi me ko mākou mea nona:

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

E wehe mākou i ka faila no ke kākau ʻana ma kā mākou papahana wale nō:

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

Hoʻolana

[user@localhost ]$ python openforwrite.py 

Kali mākou i kekahi mau kekona

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

No laila, loaʻa iā mākou ka pilikia i wehewehe ʻia ma ka hoʻomaka o kēia ʻatikala. Wahi kaʻawale 0, 100% noho ʻia.

Hoʻomanaʻo mākou e like me nā kūlana o ka hana, ke hoʻāʻo nei mākou e hoʻopaʻa i nā ʻikepili koʻikoʻi loa i hiki ʻole ke nalowale. A i ka manawa like, pono mākou e hoʻoponopono i ka lawelawe me ka ʻole e hoʻomaka hou i ke kaʻina hana.

E ʻōlelo mākou he wahi disk kā mākou, akā ma kahi ʻāpana ʻokoʻa, no ka laʻana ma /home.

E ho'āʻo mākou e "hoʻoponopono hou i ka lele" i kā mākou code.

E nānā kākou i ka PID o kā mākou kaʻina hana, nāna i ʻai i nā wahi diski āpau:

[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

Hoʻohui i ke kaʻina hana ma o gdb

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

E nānā kākou i nā wehewehe wehewehe waihona:

(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

Ke nānā nei mākou i ka ʻike e pili ana i ka faila descriptor helu 3, kahi mea hoihoi iā mākou

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

Ke hoʻomanaʻo nei i ka mea i kapa ʻia ʻo Python e hana ai (e ʻike i luna ma kahi a mākou i holo ai a loaʻa ka leo hamama), i ka wā e hoʻoponopono ai i kā mākou code e wehe i kahi faila, hana mākou iā mākou iho ma ka inoa o kā mākou kaʻina hana, akā pono mākou i ka O_WRONLY|O_CREAT| Hoʻololi nā ʻāpana O_TRUNC me kahi waiwai helu. No ka hana ʻana i kēia, wehe i nā kumu kernel, no ka laʻana maanei a e nana i na hae ke kuleana o ke aha

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

Hoʻohui mākou i nā waiwai āpau i hoʻokahi, loaʻa iā mākou 00001101

Holo mākou i kā mākou kelepona mai gdb

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

No laila ua loaʻa iā mākou kahi wehewehe faila hou me ka helu 4 a me kahi faila wehe hou ma kahi ʻāpana ʻē aʻe, nānā mākou:

(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

Hoʻomanaʻo mākou i ka laʻana me ka paipu - pehea ka hoʻololi ʻana o bash i nā faila wehewehe, a ua aʻo mua mākou i ke kelepona ʻōnaehana dup2.

Ke hoʻāʻo nei mākou e hoʻololi i kahi mea wehewehe faila me kekahi

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

E nānā mākou:

(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

Hoʻopau mākou i ka wehewehe faila 4, no ka mea ʻaʻole pono mākou:

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

A haʻalele i ka 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

Ke nānā nei i ka faila hou:

[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

E like me kāu e ʻike ai, ua kākau ʻia ka ʻikepili i kahi faila hou, e nānā i ka mea kahiko:

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

ʻAʻohe ʻikepili i nalowale, hana ka noi, kākau ʻia nā lāʻau i kahi wahi hou.

E hoʻopili liʻiliʻi i ka hana

E noʻonoʻo kākou he mea koʻikoʻi ka ʻikepili iā mākou, akā ʻaʻohe o mākou wahi disk ma kekahi o nā ʻāpana a ʻaʻole hiki iā mākou ke hoʻohui i ka disk.

ʻO ka mea hiki iā mākou ke hoʻihoʻi hou i kā mākou ʻikepili i kekahi wahi, no ka laʻana i ka paipu, a ma ka huli hoʻihoʻi ʻana i ka ʻikepili mai ka paipu i ka pūnaewele ma o kekahi papahana, no ka laʻana netcat.
Hiki iā mākou ke hana i kahi paipu i kapa ʻia me ke kauoha mkfifo. E hana ia i kahi faila pseudo ma ka ʻōnaehana faila inā ʻaʻohe wahi kaʻawale ma luna.

E hoʻomaka hou i ka polokalamu a nānā:

[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

ʻAʻohe wahi disk, akā ua hana maikaʻi mākou i kahi paipu i kapa ʻia ma laila:

[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

I kēia manawa pono mākou e hoʻopili i nā ʻikepili a pau i komo i loko o kēia paipu i kahi kikowaena ʻē aʻe ma o ka pūnaewele; ua kūpono ka netcat like no kēia.

Hoʻomaka mākou ma ka server remote-server.example.com

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

Ma kā mākou kikowaena pilikia, hoʻomaka mākou i kahi kikowaena kaʻawale

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

I kēia manawa, e hele koke nā ʻikepili a pau i ka paipu i stdin ma netcat, e hoʻouna iā ia i ka pūnaewele ma ke awa 7777.

ʻO kā mākou mea e hana ai, ʻo ka hoʻomaka ʻana e kākau i kā mākou ʻikepili i loko o kēia paipu i kapa ʻia.

Loaʻa iā mākou ka polokalamu e holo nei:

[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

ʻO nā hae a pau, pono mākou iā O_WRONLY no ka mea aia ka faila a ʻaʻole pono mākou e holoi.

[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

Ke nānā nei i ke kikowaena mamao remote-server.example.com

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

Ke hele mai nei ka ʻikepili, nānā mākou i ka server pilikia

[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

Mālama ʻia ka ʻikepili, hoʻopau ʻia ka pilikia.

Lawe wau i kēia manawa e aloha aku i koʻu mau hoa hana mai Degiro.
E hoʻolohe i nā podcast Radio-T.

Maikaʻi.

Ma ke ʻano he haʻawina home, manaʻo wau e noʻonoʻo ʻoe i ka mea e hana ʻia i loko o ke kaʻina faila descriptors cat a hiamoe inā holo ʻoe i kēia kauoha:

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

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka