Π€Π°ΠΉΠ» дСскриптор Π² Linux с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ

Π’Π΅Π΄Π½ΡŠΠΆ, Π½Π° Π΅Π΄Π½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŽ ΠΌΠΈ Π·Π°Π΄Π°Π΄ΠΎΡ…Π° Π²ΡŠΠΏΡ€ΠΎΡ: ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΡˆ, Π°ΠΊΠΎ ΠΎΡ‚ΠΊΡ€ΠΈΠ΅Ρˆ Π½Π΅Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰Π° услуга Π·Π°Ρ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ Π΄ΠΈΡΠΊΡŠΡ‚ Π΅ запълнСн?

Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΡ…, Ρ‡Π΅ Ρ‰Π΅ провСря ΠΊΠ°ΠΊΠ²ΠΎ Π·Π°Π΅ΠΌΠ° Ρ‚ΠΎΠ²Π° място ΠΈ Π°ΠΊΠΎ Π΅ възмоТно, Ρ‰Π΅ освобода пространство.
Π’ΠΎΠ³Π°Π²Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŽΠΈΡ€Π°Ρ‰ΠΈΡΡ‚ ΠΏΠΎΠΏΠΈΡ‚Π°, Π° ΠΊΠ°ΠΊΠ²ΠΎ Π°ΠΊΠΎ Π½Π° дяла няма свободно място, Π½ΠΎ ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π΄Π° Π·Π°Π΅ΠΌΠ°Ρ‚ всичкото пространство, Π½Π΅ виТдаш?

На Ρ‚ΠΎΠ²Π° ΠΊΠ°Π·Π°Ρ…, Ρ‡Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Ρ‚ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптори, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° lsof ΠΈ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ коя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π΅ Π·Π°Π΅Π»Π° всичкото Π½Π°Π»ΠΈΡ‡Π½ΠΎ място, Π° слСд Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° дСйствамС Π² зависимост ΠΎΡ‚ обстоятСлствата, Π² зависимост ΠΎΡ‚ Ρ‚ΠΎΠ²Π° Π΄Π°Π»ΠΈ Π΄Π°Π½Π½ΠΈΡ‚Π΅ са Π²Π°ΠΆΠ½ΠΈ.

Π˜Π½Ρ‚Π΅Ρ€Π²ΡŽΠΈΡ€Π°Ρ‰ΠΈΡΡ‚ ΠΌΠ΅ ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π° Π² послСдната Π΄ΡƒΠΌΠ°, допълвайки Π²ΡŠΠΏΡ€ΠΎΡΠ° си: "Π”Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π½Π΅ Π½ΠΈ трябват, Ρ‚ΠΎΠ²Π° Π΅ просто дСбъг Π»ΠΎΠ³, Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° запишС дСбъг"?

"ОкСй", ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΡ… Π°Π·, "ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΠΌ дСбъга Π² конфигурацията Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° Π³ΠΎ рСстартирамС".
Π˜Π½Ρ‚Π΅Ρ€Π²ΡŽΠΈΡ€Π°Ρ‰ΠΈΡΡ‚ Π²ΡŠΠ·Ρ€Π°Π·ΠΈ: "НС, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° рСстартирамС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° всС ΠΎΡ‰Π΅ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°ΠΌΠ΅ Π²Π°ΠΆΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, Π° към самата услуга са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ Π²Π°ΠΆΠ½ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΊΠ°Ρ€Π°ΠΌΠ΅ Π΄Π° сС прСинсталират".

"Π”ΠΎΠ±Ρ€Π΅", ΠΊΠ°Π·Π°Ρ… Π°Π·, "Π°ΠΊΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° рСстартирамС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π½Π΅ са Π²Π°ΠΆΠ½ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ просто Π΄Π° изчистим Ρ‚ΠΎΠ·ΠΈ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ Ρ„Π°ΠΉΠ» Ρ‡Ρ€Π΅Π· файловия дСскриптор, Π΄ΠΎΡ€ΠΈ Π°ΠΊΠΎ Π½Π΅ Π³ΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ls Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма".

Π˜Π½Ρ‚Π΅Ρ€Π²ΡŽΠΈΡ€Π°Ρ‰ΠΈΡΡ‚ остана Π΄ΠΎΠ²ΠΎΠ»Π΅Π½, Π° Π°Π· Π½Π΅.

Π’ΠΎΠ³Π°Π²Π° си помислих, Π·Π°Ρ‰ΠΎ Ρ‡ΠΎΠ²Π΅ΠΊΡŠΡ‚, провСряващ ΠΌΠΎΠΈΡ‚Π΅ знания, Π½Π΅ Π·Π°Π΄ΡŠΠ»Π±ΠΎΡ‡Π°Π²Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅? А ΠΊΠ°ΠΊΠ²ΠΎ, Π°ΠΊΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ са Π²Π°ΠΆΠ½ΠΈ? Какво Π°ΠΊΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° рСстартирамС процСса ΠΈ Π² ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Ρ‚ΠΎΠ·ΠΈ процСс записва Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма Π² дял, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ няма свободно място? Какво Π°ΠΊΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°Π³ΡƒΠ±ΠΈΠΌ Π½Π΅ само Π²Π΅Ρ‡Π΅ записанитС Π΄Π°Π½Π½ΠΈ, Π½ΠΎ ΠΈ Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‚ΠΎΠ·ΠΈ процСс записва ΠΈΠ»ΠΈ сС ΠΎΠΏΠΈΡ‚Π²Π° Π΄Π° запишС?

Π’ΡƒΠ·ΠΈΠΊ

Π’ Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° ΠΊΠ°Ρ€ΠΈΠ΅Ρ€Π°Ρ‚Π° си сС ΠΎΠΏΠΈΡ‚Π°Ρ… Π΄Π° създам ΠΌΠ°Π»ΠΊΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΠ΅Ρ‚ΠΎ Π΄Π° сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° информация Π·Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅. Π’ΠΎΠ³Π°Π²Π° си мислСх ΠΊΠ°ΠΊ Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ° потрСбитСля с Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΌΡƒ. НапримСр, ΠΈΠΌΠ°ΠΌ Иванов Иван Π˜Π²Π°Π½Ρ‹Ρ‡, ΠΈ Ρ‚ΠΎΠΉ ΠΈΠΌΠ° Π΄Π°Π½Π½ΠΈ, Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ ΡΠ²ΡŠΡ€ΠΆΠ°? Мога Π΄Π° посоча Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ, Ρ‡Π΅ ΠΊΡƒΡ‡Π΅Ρ‚ΠΎ Π½Π° ΠΈΠΌΠ΅ "Π’ΡƒΠ·ΠΈΠΊ" ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈ Π½Π° Π½Π΅Π³ΠΎ. Но ΠΊΠ°ΠΊΠ²ΠΎ, Π°ΠΊΠΎ Ρ‚ΠΎΠΉ смСни ΠΈΠΌΠ΅Ρ‚ΠΎ си ΠΈ вмСсто Иван станС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Оля? Π’ Ρ‚Π°ΠΊΡŠΠ² случай Π½Π°ΡˆΠ°Ρ‚Π° Оля Ивановна Иванова Π²Π΅Ρ‡Π΅ няма Π΄Π° ΠΈΠΌΠ° ΠΊΡƒΡ‡Π΅, Π° Π½Π°ΡˆΠΈΡΡ‚ Π’ΡƒΠ·ΠΈΠΊ всС ΠΎΡ‰Π΅ Ρ‰Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈ Π½Π° Π½Π΅ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈΡ Иван. Π Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΄ΠΎΠΉΠ΄Π΅ с Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, която давашС ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ (ID) Π½Π° всСки ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», ΠΈ моят Π’ΡƒΠ·ΠΈΠΊ сС ΡΠ²ΡŠΡ€Π·Π²Π°ΡˆΠ΅ с Ρ‚ΠΎΠ·ΠΈ ID, ΠΊΠΎΠΉΡ‚ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ бСшС просто ΠΏΠΎΡ€Π΅Π΄Π΅Π½ Π½ΠΎΠΌΠ΅Ρ€. По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½ΠΈΠΊΡŠΡ‚ Π½Π° Π’ΡƒΠ·ΠΈΠΊ имашС ID Π½ΠΎΠΌΠ΅Ρ€ 2, ΠΈ Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠ΄ Ρ‚ΠΎΠ·ΠΈ ID бСшС Иван, Π° слСд Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ΄ ΡΡŠΡ‰ΠΈΡ ID стана Оля. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π½Π° човСчСството ΠΈ ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ²ΡŠΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ бСшС ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ€Π΅ΡˆΠ΅Π½.

Π€Π°ΠΉΠ»ΠΎΠ² дСскриптор

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ с Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰Π° с Π½Π΅Π³ΠΎ, Π΅ similar Π½Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΊΡƒΡ‡Π΅ ΠΈ Ρ‡ΠΎΠ²Π΅ΠΊ. Π”Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ… Ρ„Π°ΠΉΠ»Π° с ΠΈΠΌΠ΅ ivan.txt ΠΈ Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ… Π΄Π° записвам Π΄ΡƒΠΌΠ°Ρ‚Π° tuzik, Π½ΠΎ успях Π΄Π° запиша само ΠΏΡŠΡ€Π²Π°Ρ‚Π° Π±ΡƒΠΊΠ²Π° "t" Π² Ρ„Π°ΠΉΠ»Π°, ΠΈ Ρ„Π°ΠΉΠ»ΡŠΡ‚ бСшС ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° olya.txt. Но Ρ„Π°ΠΉΠ»ΡŠΡ‚ остана ΡΡŠΡ‰ΠΈΡΡ‚, ΠΈ всС ΠΎΡ‰Π΅ искам Π΄Π° запиша моя Π’ΡƒΠ·ΠΈΠΊ Π² Π½Π΅Π³ΠΎ. ВсСки ΠΏΡŠΡ‚ ΠΏΡ€ΠΈ отварянС Π½Π° Ρ„Π°ΠΉΠ»Π° с систСмСн ΠΏΠΎΠ²ΠΈΠΊ open Π½Π° ΠΊΠ°ΠΊΡŠΠ²Ρ‚ΠΎ ΠΈ Π΄Π° Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Π½ Π΅Π·ΠΈΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ ID, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° Ρ„Π°ΠΉΠ»Π°, Ρ‚ΠΎΠ·ΠΈ ID Π΅ файловият дСскриптор. И съвсСм Π½Π΅ Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈ ΠΊΠΎΠΉ ΠΏΡ€Π°Π²ΠΈ с Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ, Ρ‚ΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚, ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½, ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ собствСник ΠΈΠ»ΠΈ Π΄Π° ΠΌΡƒ сС ΠΎΡ‚Π½Π΅ΠΌΠ°Ρ‚ ΠΏΡ€Π°Π²Π°Ρ‚Π° Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΈ запис, Π°Π· всС ΠΎΡ‰Π΅ Ρ‰Π΅ ΠΈΠΌΠ°ΠΌ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Π½Π΅Π³ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° отварянС Π½Π° Ρ„Π°ΠΉΠ»Π° ΠΈΠΌΠ°Ρ… ΠΏΡ€Π°Π²Π° Π΄Π° Π³ΠΎ Ρ‡Π΅Ρ‚Π° ΠΈ/ΠΈΠ»ΠΈ записвам ΠΈ успях Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π½Π΅Π³ΠΎ, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ трябва Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ° Π΄Π° Π³ΠΎ правя.

Π’ Linux Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° libc отваря 3 Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптора Π·Π° всяко стартирано ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (процСс) с Π½ΠΎΠΌΠ΅Ρ€Π° 0, 1, 2. ΠŸΠΎΠ²Π΅Ρ‡Π΅ информация ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Π»ΠΈΠ½ΠΊΠΎΠ²Π΅Ρ‚Π΅ man stdio ΠΈ man stdout

  • Ѐайловият дСскриптор 0 сС Π½Π°Ρ€ΠΈΡ‡Π° STDIN ΠΈ Π΅ асоцииран с въвСТданС Π½Π° Π΄Π°Π½Π½ΠΈ Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ
  • Π€Π°ΠΉΠ» дСскриптор 1 Π΅ STDOUT ΠΈ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ‚ прилоТСния Π·Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ print.
  • Π€Π°ΠΉΠ» дСскриптор 2 Π΅ STDERR ΠΈ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ‚ прилоТСния Π·Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΠΎΠ±Ρ‰Π°Π²Π°Ρ‚ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ.

Ако Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° си ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ някой Ρ„Π°ΠΉΠ» Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΈΠ»ΠΈ запис, Π½Π°ΠΉ-вСроятно Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡŠΡ€Π²ΠΈΡ свободСн ID, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ бъдС Π½ΠΎΠΌΠ΅Ρ€ 3.

Π‘ΠΏΠΈΡΡŠΠΊΡŠΡ‚ с Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптори ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ ΠΏΡ€ΠΈ всСки процСс, Π°ΠΊΠΎ Π·Π½Π°Π΅Ρ‚Π΅ нСговия PID.

НапримСр, Ρ‰Π΅ ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° с bash ΠΈ Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ PID Π½Π° нашия процСс.

[user@localhost ]$ echo $$
15771

Π’ΡŠΠ² Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° Ρ‰Π΅ стартирамС

[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

Π€Π°ΠΉΠ» дСскриптор с Π½ΠΎΠΌΠ΅Ρ€ 255 ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΄Π° ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°Ρ‚Π΅ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ статия, Ρ‚ΠΎΠΉ Π΅ Π±ΠΈΠ» ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ Π·Π° собствСнитС Π½ΡƒΠΆΠ΄ΠΈ Π½Π° bash, Π° Π½Π΅ ΠΎΡ‚ Π»ΠΈΠ½ΠΊΠΎΠ²Π°Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°.

Π‘Π΅Π³Π° всичкитС 3 Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптора са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с устройството Π½Π° псСвдотСрминал. /dev/pts, Π½ΠΎ всС ΠΏΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°ΠΌΠ΅ с тях, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‰Π΅ стартирамС във Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°.

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

И Π² ΠΏΡŠΡ€Π²Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ.

[user@localhost ]$ hello world

Redirect ΠΈ Pipe

ΠœΠΎΠΆΠ΅Ρ‚Π΅ лСсно Π΄Π° ΠΏΡ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ‚Π΅Π·ΠΈ 3 Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптора Π² всСки процСс, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈ Π² bash, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‡Ρ€Π΅Π· Ρ‚Ρ€ΡŠΠ±Π° (pipe), ΡΠ²ΡŠΡ€Π·Π²Π°Ρ‰Π° Π΄Π²Π° процСса, Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ.

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

ΠœΠΎΠΆΠ΅Ρ‚Π΅ сами Π΄Π° стартиратС Ρ‚Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° с strace -f ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ сС случва Π²ΡŠΡ‚Ρ€Π΅, Π½ΠΎ Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ Ρ‰Π΅ Π²ΠΈ Ρ€Π°Π·ΠΊΠ°ΠΆΠ°.

ΠΠ°ΡˆΠΈΡΡ‚ родитСлски процСс bash с PID 15771 Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π° ΠΊΠΎΠ»ΠΊΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ искамС Π΄Π° стартирамС, Π² нашия случай Ρ‚Π΅ са Π΄Π²Π΅: cat ΠΈ sleep. Bash Π·Π½Π°Π΅, Ρ‡Π΅ трябва Π΄Π° създадС Π΄Π²Π° Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ процСса ΠΈ Π΄Π° Π³ΠΈ ΡΠ²ΡŠΡ€ΠΆΠ΅ с Π΅Π΄Π½Π° Ρ‚Ρ€ΡŠΠ±Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, bash Ρ‰Π΅ изисква 2 Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ процСса ΠΈ Π΅Π΄Π½Π° Ρ‚Ρ€ΡŠΠ±Π°.

ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° създадС Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ процСси, bash изпълнява систСмСн ΠΏΠΎΠ²ΠΈΠΊ pipe ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° Π½ΠΎΠ²ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптори Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΡ‚ΠΎ Π±ΡƒΡ„Π΅Ρ€Π½ΠΎ пространство Π½Π° Ρ‚Ρ€ΡŠΠ±Π°Ρ‚Π°, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π±ΡƒΡ„Π΅Ρ€Π½ΠΎ пространство всС ΠΎΡ‰Π΅ Π½Π΅ Π²Ρ€ΡŠΠ·Π²Π° Π½Π°ΡˆΠΈΡ‚Π΅ Π΄Π²Π° Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ процСса.

Π—Π° родитСлския процСс Ρ‚ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°, сякаш Ρ‚Ρ€ΡŠΠ±Π°Ρ‚Π° Π²Π΅Ρ‡Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°, Π° Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈΡ‚Π΅ процСси ΠΎΡ‰Π΅ Π½Π΅ са Π½Π°Π»ΠΈΡ‡Π½ΠΈ.

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

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° систСмСн ΠΏΠΎΠ²ΠΈΠΊ clone bash създава Π΄Π²Π° потомствСни процСса, ΠΈ Ρ‚Ρ€ΠΈΡ‚Π΅ Π½ΠΈ процСса Ρ‰Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚ Ρ‚Π°ΠΊΠ°:

PID    ΠΊΠΎΠΌΠ°Π½Π΄Π°
15771  bash
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:42 255 -> /dev/pts/21
PID    ΠΊΠΎΠΌΠ°Π½Π΄Π°
9004  bash
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 255 -> /dev/pts/21
PID    ΠΊΠΎΠΌΠ°Π½Π΄Π°
9005  bash
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 ΠžΠΊΡ‚  7 15:57 255 -> /dev/pts/21

НС забравяйтС, Ρ‡Π΅ clone ΠΊΠ»ΠΎΠ½ΠΈΡ€Π° процСса Π·Π°Π΅Π΄Π½ΠΎ с всички Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптори, Π·Π°Ρ‚ΠΎΠ²Π° Π² родитСлския ΠΈ потомствСнитС процСси Ρ‚Π΅ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π΅Π΄Π½Π°ΠΊΠ²ΠΈ. Π—Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π½Π° родитСлския процСс с PID 15771 Π΅ Π΄Π° слСди потомствСнитС процСси, Π·Π°Ρ‚ΠΎΠ²Π° Ρ‚ΠΎΠΉ просто Ρ‡Π°ΠΊΠ° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ ΠΎΡ‚ тях.

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ pipe Π½Π΅ ΠΌΡƒ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, ΠΈ Ρ‚ΠΎΠΉ затваря Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‚Π΅ дСскриптори с Π½ΠΎΠΌΠ΅Ρ€Π° 3 ΠΈ 4.

Π’ ΠΏΡŠΡ€Π²ΠΈΡ потомствСн процСс bash с PID 9004, със систСмСн ΠΏΠΎΠ²ΠΈΠΊ dup2, промСня нашия STDOUT Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор с Π½ΠΎΠΌΠ΅Ρ€ 1 Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор, сочСщ към pipe, Π² нашия случай Ρ‚ΠΎΠ²Π° Π΅ Π½ΠΎΠΌΠ΅Ρ€ 3. Π’Π°ΠΊΠ° всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡŠΡ€Π²ΠΈΡΡ‚ потомствСн процСс с PID 9004 Ρ‰Π΅ пишС Π² STDOUT, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Ρ‰Π΅ ΠΏΠΎΠΏΠ°Π΄Π° Π² Π±ΡƒΡ„Π΅Ρ€Π° Π½Π° pipe.

Π’ΡŠΠ² втория потомствСн процСс с PID 9005 bash промСня с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° dup2 файловия дСскриптор STDIN с Π½ΠΎΠΌΠ΅Ρ€ 0. Π‘Π΅Π³Π° всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ вторият bash с PID 9005 Ρ‰Π΅ Ρ‡Π΅Ρ‚Π΅, Ρ‰Π΅ Ρ‡Π΅Ρ‚Π΅ ΠΎΡ‚ pipe.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π² потомствСнитС процСси ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° сС затварят Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‚Π΅ дСскриптори с Π½ΠΎΠΌΠ΅Ρ€Π° 3 ΠΈ 4, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅ Π²Π΅Ρ‡Π΅ Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚.

Π€Π°ΠΉΠ» дСскриптор 255 ΡƒΠΌΠΈΡˆΠ»Π΅Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°ΠΌ, Ρ‚ΠΎΠΉ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈ Π½ΡƒΠΆΠ΄ΠΈ Π½Π° самия bash ΠΈ Π² потомствСнитС процСси ΡΡŠΡ‰ΠΎ Ρ‰Π΅ бъдС Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π² ΠΏΡŠΡ€Π²ΠΈΡ потомствСн процСс с PID 9004 bash стартира със систСмСн ΠΏΠΎΠ²ΠΈΠΊ exec изпълнимия Ρ„Π°ΠΉΠ», ΠΊΠΎΠΉΡ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ…ΠΌΠ΅ Π² командния Ρ€Π΅Π΄, Π² нашия случай Ρ‚ΠΎΠ²Π° Π΅ /usr/bin/cat.

Π’ΡŠΠ² втория потомствСн процСс с PID 9005 bash стартира втория изпълним Ρ„Π°ΠΉΠ», ΠΊΠΎΠΉΡ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ…ΠΌΠ΅, Π² нашия случай Ρ‚ΠΎΠ²Π° Π΅ /usr/bin/sleep.

БистСмният ΠΏΠΎΠ²ΠΈΠΊ exec Π½Π΅ затваря дСскрипторитС Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅, Π°ΠΊΠΎ Π½Π΅ са Π±ΠΈΠ»ΠΈ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈ с Ρ„Π»Π°Π³Π° O_CLOEXEC ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° open. Π’ нашия случай слСд стартиранС Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΠΌΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ всички Ρ‚Π΅ΠΊΡƒΡ‰ΠΈ дСскриптори Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ остават Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅ Π² консолата:

[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

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠΆΠ΄Π°Ρ‚Π΅, уникалният Π½ΠΎΠΌΠ΅Ρ€ Π½Π° нашия pipe съвпада Π² Π΄Π²Π°Ρ‚Π° процСса. Π’Π°ΠΊΠ° ΠΈΠΌΠ°ΠΌΠ΅ Π²Ρ€ΡŠΠ·ΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ процСса с Π΅Π΄ΠΈΠ½ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π».

Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са Π·Π°ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ със систСмнитС повиквания, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΎΡ‚ bash, Π³ΠΎΡ€Π΅Ρ‰ΠΎ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°ΠΌ Π΄Π° стартиратС ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ Ρ‡Ρ€Π΅Π· strace ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ сС случва Π²ΡŠΡ‚Ρ€Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠ°:

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

НСка сС Π²ΡŠΡ€Π½Π΅ΠΌ към нашия ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с липсата Π½Π° място Π½Π° диска ΠΈ ΠΎΠΏΠΈΡ‚ΠΈΡ‚Π΅ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π΄Π°Π½Π½ΠΈ Π±Π΅Π· Π΄Π° рСстартирамС процСса. НСка напишСм ΠΌΠ°Π»ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, която Ρ‰Π΅ записва Π½Π° диска ΠΎΠΊΠΎΠ»ΠΎ 1 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ Π² сСкунда. Π’Π°ΠΆΠ½ΠΎ Π΅, Π°ΠΊΠΎ ΠΏΠΎ някаква ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π½Π΅ успССм Π΄Π° запишСм Π΄Π°Π½Π½ΠΈ Π½Π° диска, просто Π΄Π° ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°ΠΌΠ΅ Ρ‚ΠΎΠ²Π° ΠΈ Π΄Π° ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π΄Π° запишСм Π΄Π°Π½Π½ΠΈ слСд сСкунда. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Python, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΈ Π΄Ρ€ΡƒΠ³ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅.

[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

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‚Π΅ дСскриптори.

[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

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, ΠΈΠΌΠ°ΠΌΠ΅ Ρ‚Ρ€ΠΈΡ‚Π΅ стандартни Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптора плюс Π΅Π΄ΠΈΠ½, ΠΊΠΎΠΉΡ‚ΠΎ ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ…ΠΌΠ΅. НСка ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Ρ„Π°ΠΉΠ»Π°:

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

Π΄Π°Π½Π½ΠΈΡ‚Π΅ сС записват, ΠΏΡ€ΠΎΠ±Π²Π°ΠΌΠ΅ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€Π°Π²Π°Ρ‚Π° Π½Π° Ρ„Π°ΠΉΠ»Π°:

[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

Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅, Ρ‡Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ всС ΠΎΡ‰Π΅ сС записват, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ Π½Π°ΡˆΠΈΡΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» няма ΠΏΡ€Π°Π²ΠΎ Π΄Π° записва Π² Ρ„Π°ΠΉΠ»Π°. НСка ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅ΠΌ:

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

КъдС сС записват Π΄Π°Π½Π½ΠΈΡ‚Π΅? И Π΄Π°Π»ΠΈ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ сС записват? ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅:

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

Π”Π°, Π½Π°ΡˆΠΈΡΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор всС ΠΎΡ‰Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ с Π½Π΅Π³ΠΎ Ρ‚Π°ΠΊΠ°, сякаш Π΅ Π½Π°ΡˆΠΈΡΡ‚ стар Ρ„Π°ΠΉΠ», ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΎ Ρ‡Π΅Ρ‚Π΅ΠΌ, почиствамС ΠΈ ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅.

НСка Π²ΠΈΠ΄ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Ρ„Π°ΠΉΠ»Π°:

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

Π Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Ρ„Π°ΠΉΠ»Π° Π΅ 19923457. НСка ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° изчистим Ρ„Π°ΠΉΠ»Π°:

[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

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Ρ„Π°ΠΉΠ»Π° само нараства ΠΈ Π½Π°ΡˆΠΈΡΡ‚ truncate Π½Π΅ сработи. НСка сС ΠΎΠ±ΡŠΡ€Π½Π΅ΠΌ към докумСнтацията Π·Π° систСмното ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ open. Ако ΠΏΡ€ΠΈ отварянС Π½Π° Ρ„Π°ΠΉΠ»Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ„Π»Π°Π³Π° O_APPEND, Ρ‚ΠΎ ΠΏΡ€ΠΈ всяко записванС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ‚Π° систСма провСрява Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Ρ„Π°ΠΉΠ»Π° ΠΈ записва Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² края Π½Π° Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€Π°Π²Π΅ΠΉΠΊΠΈ Ρ‚ΠΎΠ²Π° Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ. Π’ΠΎΠ²Π° позволява Π½Π° няколко нишки ΠΈΠ»ΠΈ процСса Π΄Π° записват Π² Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ΠΈ Ρ„Π°ΠΉΠ». Но Π² нашия ΠΊΠΎΠ΄ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ‚ΠΎΠ·ΠΈ Ρ„Π»Π°Π³. МоТСм Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π΄Ρ€ΡƒΠ³ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° Ρ„Π°ΠΉΠ»Π° Π² lsof слСд truncate само Π°ΠΊΠΎ ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌ Ρ„Π°ΠΉΠ»Π° Π·Π° добавянС, Ρ‚ΠΎΠ³Π°Π²Π° Π² нашия ΠΊΠΎΠ΄ вмСсто

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

трябва Π΄Π° напишСм

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅ с Ρ„Π»Π°Π³Π° β€ž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"

[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

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΠΌΠ΅ Π²Π΅Ρ‡Π΅ стартиран процСс

ЧСсто програмиститС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π΄Π΅Π±ΡŠΠ³Π΅Ρ€ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ GDB) ΠΈΠ»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½ΠΈΠ²Π° Π½Π° Π»ΠΎΠ³Π²Π°Π½Π΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΏΡ€ΠΈ създаванС ΠΈ тСстванС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°. Linux ΠΏΡ€Π΅Π΄Π»Π°Π³Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Ρ€Π΅Π°Π»Π½ΠΎ Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΈ промСнятС Π²Π΅Ρ‡Π΅ стартирана ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π° промСнятС стойноститС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π΄Π° Π·Π°Π΄Π°Π²Π°Ρ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅ ΠΈ Ρ‚.Π½.

Π’Ρ€ΡŠΡ‰Π°ΠΉΠΊΠΈ сС към оригиналния Π²ΡŠΠΏΡ€ΠΎΡ Π·Π° Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎΡ‚ΠΎ пространство Π½Π° диска Π·Π° запис Π½Π° Ρ„Π°ΠΉΠ», Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° симулирамС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

БъздавамС Ρ„Π°ΠΉΠ» Π·Π° нашия дял, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΌΠΎΠ½Ρ‚ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ диск:

[user@localhost ~]$ dd if=/dev/zero of=~/tempfile_for_article.dd bs=1M count=10
10+0 записи в
10+0 записи из
10485760 Π±Π°ΠΉΡ‚Π° (10 ΠœΠ‘) ΠΊΠΎΠΏΠΈΡ€Π°Π½ΠΈ, 0.00525929 с, 2.0 Π“Π‘/с
[user@localhost ~]$

БъздавамС Ρ„Π°ΠΉΠ»ΠΎΠ²Π° систСма:

[user@localhost ~]$ mkfs.ext4 ~/tempfile_for_article.dd
mke2fs 1.42.9 (28-Dec-2013)
/home/user/tempfile_for_article.dd Π½Π΅ Π΅ Π±Π»ΠΎΠΊΠΎΠ²ΠΎ спСциално устройство.
Π”Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΠΌ Π»ΠΈ? (y,n) y
...
ЗаписванС Π½Π° супСрблоковС ΠΈ информация Π·Π° счСтоводство Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма: Π³ΠΎΡ‚ΠΎΠ²ΠΎ
[user@localhost ~]$

ΠœΠΎΠ½Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма:

[user@localhost ~]$ sudo mount ~/tempfile_for_article.dd /mnt/
[sudo] ΠΏΠ°Ρ€ΠΎΠ»Π° Π·Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»: 
[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  172K  7.9M   3% /mnt

БъздавамС дирСктория с нашия собствСник:

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

ΠžΡ‚Π²Π°Ρ€ΡΠΌΠ΅ Ρ„Π°ΠΉΠ» само Π·Π° запис Π² Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°:

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

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅

[user@localhost ]$ python openforwrite.py 

Π§Π°ΠΊΠ°ΠΌΠ΅ няколко сСкунди

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

И Ρ‚Π°ΠΊΠ°, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, описан Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ статия. Π‘Π²ΠΎΠ±ΠΎΠ΄Π½ΠΎ място 0, Π·Π°Π΅Ρ‚ΠΎ 100%.

Помним, Ρ‡Π΅ спрямо условията Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° сС ΠΎΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ Π΄Π° запишСм ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС загубят. И ΡΡŠΡ‰Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½ΠΈ трябва Π΄Π° ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠΌ услугата Π±Π΅Π· Π΄Π° рСстартирамС процСса.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ всС ΠΏΠ°ΠΊ ΠΈΠΌΠ°ΠΌΠ΅ място Π½Π° диска, Π½ΠΎ Π² Π΄Ρ€ΡƒΠ³Π° част, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² /home.

ΠžΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ сС "Π΄Π° прСнаписвамС Π½Π° лСтящо" нашия ΠΊΠΎΠ΄.

Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅ PID Π½Π° нашия процСс, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ изял всички мСста Π½Π° диска:

[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

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ сС с процСса ΠΏΡ€Π΅Π· gdb

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптори:

(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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅ информацията Π·Π° файловия дСскриптор Π½ΠΎΠΌΠ΅Ρ€ 3, ΠΊΠΎΠΉΡ‚ΠΎ Π½ΠΈ интСрСсува

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

Помня ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ систСмСн ΠΏΠΎΠ²ΠΈΠΊ ΠΏΡ€Π°Π²ΠΈ Python (Π²ΠΈΠΆΡ‚Π΅ ΠΏΠΎ-Π³ΠΎΡ€Π΅, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ стартирахмС strace ΠΈ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ…ΠΌΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ° open), ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°ΠΉΠΊΠΈ ΠΊΠΎΠ΄Π° Π½ΠΈ Π·Π° отварянС Π½Π° Ρ„Π°ΠΉΠ», ΠΏΡ€Π°Π²ΠΈΠΌ ΡΡŠΡ‰ΠΎΡ‚ΠΎ сами ΠΎΡ‚ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° нашия процСс, Π½ΠΎ Π±ΠΈΡ‚ΠΎΠ²Π΅Ρ‚Π΅ O_WRONLY|O_CREAT|O_TRUNC трябва Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈΠΌ с числова стойност. Π—Π° Ρ‚ΠΎΠ²Π° отварямС изходния ΠΊΠΎΠ΄ Π½Π° ядрото, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΡƒΠΊ ΠΈ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π·Π° ΠΊΠ°ΠΊΠ²ΠΎ отговарят Ρ„Π»Π°Π³ΠΎΠ²Π΅Ρ‚Π΅

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

ОбСдинявамС всички стойности Π² Π΅Π΄Π½ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ 00001101

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ° ΠΎΡ‚ gdb

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

И Ρ‚Π°ΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ Π½ΠΎΠ² дСскриптор Π½Π° Ρ„Π°ΠΉΠ» с Π½ΠΎΠΌΠ΅Ρ€ 4 ΠΈ Π½ΠΎΠ²ΠΎ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ Ρ„Π°ΠΉΠ» Π½Π° Π΄Ρ€ΡƒΠ³ дял, провСрявамС:

(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

Помним ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с pipe β€” ΠΊΠ°ΠΊ bash промСня Ρ„Π°ΠΉΠ» дСскрипторитС, ΠΈ Π²Π΅Ρ‡Π΅ Π½Π°ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ систСмния ΠΏΠΎΠ²ΠΈΠΊ dup2.

ΠžΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π΅Π΄ΠΈΠ½ Ρ„Π°ΠΉΠ» дСскриптор с Π΄Ρ€ΡƒΠ³

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅:

(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

ЗатварямС Ρ„Π°ΠΉΠ» дСскриптор 4, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π½Π΅ Π½ΠΈ Π΅ Π½ΡƒΠΆΠ΅Π½:

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

И ΠΈΠ·Π»ΠΈΠ·Π°ΠΌΠ΅ ΠΎΡ‚ 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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅ новия Ρ„Π°ΠΉΠ»:

[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

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Π΄Π°Π½Π½ΠΈΡ‚Π΅ сС записват Π² новия Ρ„Π°ΠΉΠ», провСрявамС стария:

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

Π”Π°Π½Π½ΠΈΡ‚Π΅ Π½Π΅ са Π·Π°Π³ΡƒΠ±Π΅Π½ΠΈ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅ сС записват Π½Π° Π½ΠΎΠ²ΠΎ място.

НСка услоТним Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΌΠ°Π»ΠΊΠΎ

Π”Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ са Π²Π°ΠΆΠ½ΠΈ Π·Π° нас, Π½ΠΎ нямамС място Π½Π° диска Π² Π½ΠΈΡ‚ΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ дяловСтС ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ диск.

Какво ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ, Π΅ Π΄Π° прСнасочим Π½Π°ΡˆΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² pipe, Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ pipe ΠΎΡ‚ своя страна Π΄Π° прСнасочим Π² ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Ρ‡Ρ€Π΅Π· някаква ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ netcat.
МоТСм Π΄Π° създадСм ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½ pipe с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° mkfifo. Вя Ρ‰Π΅ създадС псСвдофайл Π² Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма, Π΄ΠΎΡ€ΠΈ Π°ΠΊΠΎ Π½Π° нСя няма свободно място.

РСстартирамС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ провСрявамС:

[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

Няма място Π½Π° диска, Π½ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ създавамС ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½ pipe Ρ‚Π°ΠΌ:

[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

Π‘Π΅Π³Π° трябва Π΄Π° Π·Π°Π²ΠΈΠ΅ΠΌ всички Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΠΎΠΏΠ°Π΄Π°Π½ Π² Ρ‚ΠΎΠ·ΠΈ pipe Π½Π° Π΄Ρ€ΡƒΠ³ ΡΡŠΡ€Π²ΡŠΡ€ ΠΏΡ€Π΅Π· ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°, Π·Π° ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡŠΡ‰ΠΈΡ netcat.

На ΡΡŠΡ€Π²ΡŠΡ€Π° remote-server.example.com стартирамС

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

На нашия ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅Π½ ΡΡŠΡ€Π²ΡŠΡ€ стартирамС Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»

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

Π‘Π΅Π³Π° всички Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ‚ Π² pipe, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Ρ‰Π΅ ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ‚ Π½Π° stdin Π² netcat, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Π³ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ Π² ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π½Π° ΠΏΠΎΡ€Ρ‚ 7777.

Всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½ΠΈ остава, Π΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ Π΄Π° записвамС Π΄Π°Π½Π½ΠΈΡ‚Π΅ си Π² Ρ‚ΠΎΠ·ΠΈ ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½ pipe.

Π’Π΅Ρ‡Π΅ ΠΈΠΌΠ°ΠΌΠ΅ стартирано ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

[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_WRONLY, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ„Π°ΠΉΠ»ΡŠΡ‚ Π²Π΅Ρ‡Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° ΠΈ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π³ΠΎ изчиствамС.

[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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅ отдалСчСния ΡΡŠΡ€Π²ΡŠΡ€ remote-server.example.com

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

Π”Π°Π½Π½ΠΈΡ‚Π΅ сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚, провСрявамС проблСмния ΡΡŠΡ€Π²ΡŠΡ€.

[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

Π”Π°Π½Π½ΠΈΡ‚Π΅ са Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅ Ρ€Π΅ΡˆΠ΅Π½.

Π’ΡŠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ сС ΠΎΡ‚ случая Π΄Π° поздравя ΠΊΠΎΠ»Π΅Π³ΠΈΡ‚Π΅ ΠΎΡ‚ компанията Degiro.
Π‘Π»ΡƒΡˆΠ°ΠΉΡ‚Π΅ подкаститС Π½Π° Π Π°Π΄ΠΈΠΎ-Π’.

На всички Π΄ΠΎΠ±Ρ€ΠΎ.

Π’ качСството си Π½Π° домашно Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° помислитС ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ бъдС Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‚Π΅ дСскриптори Π½Π° процСситС cat ΠΈ sleep, Π°ΠΊΠΎ стартиратС слСдната ΠΊΠΎΠΌΠ°Π½Π΄Π°:

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

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster