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

Π’Π΅Π΄Π½ΡŠΠΆ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŽ ΠΌΠ΅ ΠΏΠΎΠΏΠΈΡ‚Π°Ρ…Π° ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅, Π°ΠΊΠΎ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ услуга, която Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π½Π° диска Π΅ ΡΠ²ΡŠΡ€ΡˆΠΈΠ»ΠΎ мястото?

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

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

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

β€žΠ”ΠΎΠ±Ρ€Π΅β€œ, ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΡ… Π°Π·, β€žΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΠΌ отстраняванСто Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² конфигурацията Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° Π³ΠΎ рСстартирамС.β€œ
Π˜Π½Ρ‚Π΅Ρ€Π²ΡŽΠΈΡ€Π°Ρ‰ΠΈΡΡ‚ Π²ΡŠΠ·Ρ€Π°Π·ΠΈ: β€žΠΠ΅, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° рСстартирамС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, всС ΠΎΡ‰Π΅ ΠΈΠΌΠ°ΠΌΠ΅ Π²Π°ΠΆΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈ Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, ΠΈ Π²Π°ΠΆΠ½ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ към самата услуга, която Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΠΌ Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅ ΠΎΡ‚Π½ΠΎΠ²ΠΎ.β€œ

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

Π˜Π½Ρ‚Π΅Ρ€Π²ΡŽΠΈΡ€Π°Ρ‰ΠΈΡΡ‚ бСшС Π΄ΠΎΠ²ΠΎΠ»Π΅Π½, Π½ΠΎ Π°Π· Π½Π΅.

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

Π’ΡƒΠ·ΠΈΠΊ

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

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

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

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

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

Ако във Π²Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Ρ„Π°ΠΉΠ» Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΈΠ»ΠΈ запис, Ρ‚ΠΎΠ³Π°Π²Π° Π½Π°ΠΉ-вСроятно Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡŠΡ€Π²ΠΈΡ Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π΅Π½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ Ρ‚ΠΎΠΉ Ρ‰Π΅ бъдС Π½ΠΎΠΌΠ΅Ρ€ 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

ΠŸΡ€Π΅Π½Π°ΡΠΎΡ‡Π²Π°Π½Π΅ ΠΈ ΠΊΠ°Π½Π°Π»

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

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

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

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

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

Π—Π° родитСлския процСс ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Ρ‡Π΅ Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° ΠΊΠ°Π½Π°Π», Π½ΠΎ всС ΠΎΡ‰Π΅ няма Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ процСси:

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

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

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

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

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

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

Π’ΡŠΠ² втория Π΄ΡŠΡ‰Π΅Ρ€Π΅Π½ процСс с PID 9005, bash ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° dup2, Π·Π° Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ файловия дСскриптор STDIN Π½ΠΎΠΌΠ΅Ρ€ 0. Π‘Π΅Π³Π° всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π°ΡˆΠΈΡΡ‚ Π²Ρ‚ΠΎΡ€ΠΈ bash с PID 9005 Ρ‰Π΅ ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅, Ρ‰Π΅ бъдС ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½ΠΎ ΠΎΡ‚ ΠΊΠ°Π½Π°Π»Π°.

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

Π‘ΡŠΠ·Π½Π°Ρ‚Π΅Π»Π½ΠΎ ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅Π³Π²Π°ΠΌ файловия дСскриптор 255; Ρ‚ΠΎΠΉ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈ Ρ†Π΅Π»ΠΈ ΠΎΡ‚ самия bash ΠΈ ΡΡŠΡ‰ΠΎ Ρ‰Π΅ бъдС Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ Π² Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ процСси.

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

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

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°:

[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

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

Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са Π·Π°ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ със систСмнитС извиквания, ΠΊΠΎΠΈΡ‚ΠΎ 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

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

[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

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

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

ΠΈ със Π·Π½Π°ΠΌΠ΅Ρ‚ΠΎ "Π°".

[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 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00525929 s, 2.0 GB/s
[user@localhost ~]$

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

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

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

[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

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

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

#define O_Π“Π Π•Π¨ΠΠž 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

НС сС губят Π΄Π°Π½Π½ΠΈ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ, рСгистрационнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ сС записват Π½Π° Π½ΠΎΠ²ΠΎ място.

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

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

Π’ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ, Π΅ Π΄Π° прСнасочим Π΄Π°Π½Π½ΠΈΡ‚Π΅ си някъдС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ към Ρ‚Ρ€ΡŠΠ±Π°, ΠΈ Π½Π° свой Ρ€Π΅Π΄ Π΄Π° прСнасочим Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ Ρ‚Ρ€ΡŠΠ±Π° към ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Ρ‡Ρ€Π΅Π· някаква ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ netcat.
МоТСм Π΄Π° създадСм ΠΊΠ°Π½Π°Π» с ΠΈΠΌΠ΅ с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° 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

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

[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

Π‘Π΅Π³Π° трябва ΠΏΠΎ някакъв Π½Π°Ρ‡ΠΈΠ½ Π΄Π° ΠΎΠ±Π²ΠΈΠ΅ΠΌ всички Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π²Π»ΠΈΠ·Π°Ρ‚ Π² Ρ‚ΠΎΠ·ΠΈ ΠΊΠ°Π½Π°Π», към Π΄Ρ€ΡƒΠ³ ΡΡŠΡ€Π²ΡŠΡ€ ΠΏΡ€Π΅Π· ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°; ΡΡŠΡ‰ΠΈΡΡ‚ netcat Π΅ подходящ Π·Π° Ρ‚ΠΎΠ²Π°.

На ΡΡŠΡ€Π²ΡŠΡ€Π° remote-server.example.com изпълнявамС

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

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

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

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

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

Π’Π΅Ρ‡Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ:

[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

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

Използвам Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π΄Π° поздравя ΠΊΠΎΠ»Π΅Π³ΠΈΡ‚Π΅ ΠΎΡ‚ Π”Π΅Π³ΠΈΡ€ΠΎ.
Π‘Π»ΡƒΡˆΠ°ΠΉΡ‚Π΅ подкасти Π½Π° Radio-T.

Π”ΠΎΠ±ΡŠΡ€ Π·Π° всички.

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

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

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€