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

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

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

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

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

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

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

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

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

Π’ΡƒΠ·ΠΈΠΊ

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

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

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ с Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, която Ρ€Π°Π±ΠΎΡ‚ΠΈ с Π½Π΅Π³ΠΎ, Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΊΡƒΡ‡Π΅ ΠΈ Ρ‡ΠΎΠ²Π΅ΠΊ. Π”Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ съм ΠΎΡ‚Π²ΠΎΡ€ΠΈΠ» Ρ„Π°ΠΉΠ»Π° 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    ΠΊΠΎΠΌΠ°Π½Π΄Π°
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

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, ΠΈΠΌΠ°ΠΌΠ΅ Π½Π°ΡˆΠΈΡ‚Π΅ 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

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Ρ„Π°ΠΉΠ»Π° само нараства ΠΈ Π½Π°ΡˆΠΈΡΡ‚ 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 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 ΠΈ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ…ΠΌΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ 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 ΠžΠΊΡ‚  8 11:27 .
dr-xr-xr-x 9 user user  0 ΠžΠΊΡ‚  8 11:27 ..
lrwx------ 1 user user 64 ΠžΠΊΡ‚  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 ΠžΠΊΡ‚  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 ΠžΠΊΡ‚  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 ΠžΠΊΡ‚  8 11:28 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 ΠžΠΊΡ‚  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 ΠžΠΊΡ‚  8 11:27 .
dr-xr-xr-x 9 user user  0 ΠžΠΊΡ‚  8 11:27 ..
lrwx------ 1 user user 64 ΠžΠΊΡ‚  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 ΠžΠΊΡ‚  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 ΠžΠΊΡ‚  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 ΠžΠΊΡ‚  8 11:28 3 -> /mnt/logs/megapipe
l-wx------ 1 user user 64 ΠžΠΊΡ‚  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 ΠžΠΊΡ‚  8 11:27 .
dr-xr-xr-x 9 user user  0 ΠžΠΊΡ‚  8 11:27 ..
lrwx------ 1 user user 64 ΠžΠΊΡ‚  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 ΠžΠΊΡ‚  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 ΠžΠΊΡ‚  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 ΠžΠΊΡ‚  8 11:28 3 -> /mnt/logs/megapipe
(gdb) quit
Активна Π΅ сСсия Π·Π° отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ.

    Нисша 1 [процСс 5946] Ρ‰Π΅ бъдС ΠΎΡ‚Π΄Π΅Π»Π΅Π½.

Π”Π° ΠΈΠ·Π»Π΅Π·Π΅Ρ‚Π΅ Π»ΠΈ наистина? (y ΠΈΠ»ΠΈ n) y
ΠžΡ‚Π΄Π΅Π»ΡΠ½Π΅ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°: /usr/bin/python2.7, процСс 5946

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

[user@localhost ~]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 38M ΠžΠΊΡ‚  8 14:21 123.txt

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

[user@localhost ~]$ ls -lah /mnt/logs/
total 7.9M
drwxr-xr-x 2 user user 1.0K ΠžΠΊΡ‚  8 11:28 .
drwxr-xr-x 4 root     root     1.0K ΠžΠΊΡ‚  8 10:55 ..
-rw-rw-r-- 1 user user 7.9M ΠžΠΊΡ‚  8 14:17 123.txt
prw-rw-r-- 1 user user    0 ΠžΠΊΡ‚  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