Π€Π°ΠΉΠ» дСскриптор Π² 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 Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСсса ΠΈ ΠΎΠ΄ΠΈΠ½ pipe.

ΠŸΠ΅Ρ€Π΅Π΄ созданиСм Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов bash запускаСт систСмный Π²Ρ‹Π·ΠΎΠ² pipe ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π°ΠΉΠ» дСскрипторы Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ pipe, Π½ΠΎ этот Π±ΡƒΡ„Π΅Ρ€ Π½ΠΈΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ° Π½Π΅ связываСт наши Π΄Π²Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСсса.

Для Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса это выглядит Ρ‚Π°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ 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    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

НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ 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

Как Π²ΠΈΠ΄ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ увСличиваСтся ΠΈ наш Ρ‚Ρ€Π°Π½ΠΊΠ΅ΠΉΡ‚ Π½Π΅ сработал. ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΡΡ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ систСмному Π²Ρ‹Π·ΠΎΠ²Ρƒ open. Если ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„Π»Π°Π³ O_APPEND, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи опСрационная систСма провСряСт Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΏΠΈΡˆΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² самый ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π΄Π΅Π»Π°Π΅Ρ‚ это Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ. Π­Ρ‚ΠΎ позволяСт нСскольким Ρ‚Ρ€Π΅Π΄Π°ΠΌ ΠΈΠ»ΠΈ процСссам ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„Π°ΠΉΠ». Но Π² нашСм ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ этот Ρ„Π»Π°Π³. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° Π² lsof послС Ρ‚Ρ€Π°Π½ΠΊΠ΅ΠΉΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ„Π°ΠΉΠ» для дозаписи, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ Π² нашСм ΠΊΠΎΠ΄Π΅ вмСсто

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 прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ фактичСски ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ breakpoint ΠΈ Ρ‚Π΄ ΠΈ Ρ‚ΠΏ.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ вопросу с Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΎΠΉ мСста Π½Π° дискС для записи Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ» для нашСго Ρ€Π°Π·Π΄Π΅Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΠΎΠ΄ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ диск:

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