์˜ˆ์ œ๊ฐ€ ํฌํ•จ๋œ Linux์˜ ํŒŒ์ผ ์„ค๋ช…์ž

ํ•œ ๋ฒˆ์€ ์ธํ„ฐ๋ทฐ ์ค‘์— ๋””์Šคํฌ ๊ณต๊ฐ„ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ์„œ๋น„์Šค๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?๋ผ๋Š” ์งˆ๋ฌธ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋‚˜๋Š” ์ด๊ณณ์ด ๋ฌด์—‡์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ทธ๊ณณ์„ ์ฒญ์†Œํ•˜๊ฒ ๋‹ค๊ณ  ๋Œ€๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฉด์ ‘๊ด€์€ ํŒŒํ‹ฐ์…˜์— ์—ฌ์œ  ๊ณต๊ฐ„์ด ์—†๋Š”๋ฐ ๊ณต๊ฐ„์„ ๋ชจ๋‘ ์ฐจ์ง€ํ•˜๋Š” ํŒŒ์ผ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ๋‚˜๋Š” ํ•ญ์ƒ ์˜ˆ๋ฅผ โ€‹โ€‹๋“ค์–ด lsof ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ด๋ฆฐ ํŒŒ์ผ ์„ค๋ช…์ž๋ฅผ ๋ณด๊ณ  ์–ด๋–ค ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ–ˆ๋Š”์ง€ ์ดํ•ดํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. .

๋ฉด์ ‘๊ด€์€ ๋งˆ์ง€๋ง‰ ๋ง์—์„œ ๋‚ด ๋ง์„ ๊ฐ€๋กœ๋ง‰๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์„ ๋ง๋ถ™์˜€์Šต๋‹ˆ๋‹ค. "๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๋””๋ฒ„๊ทธ ๋กœ๊ทธ์ผ ๋ฟ์ธ๋ฐ ๋””๋ฒ„๊ทธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค."

โ€œ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ์—์„œ ๋””๋ฒ„๊ทธ๋ฅผ ๋„๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.โ€๋ผ๊ณ  ๋‚˜๋Š” ๋Œ€๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฉด์ ‘๊ด€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์˜๋ฅผ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. "์•„๋‹ˆ์š”. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ค‘์š”ํ•œ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋น„์Šค ์ž์ฒด์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."

โ€œ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์šฐ๋ฆฌ์—๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด, ls ๋ช…๋ น์—์„œ ๋ณผ ์ˆ˜ ์—†๋”๋ผ๋„ ํŒŒ์ผ ์„ค๋ช…์ž๋ฅผ ํ†ตํ•ด ์ด ์—ด๋ฆฐ ํŒŒ์ผ์„ ๊ฐ„๋‹จํžˆ ์ง€์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์žˆ์Šต๋‹ˆ๋‹ค.โ€

๋ฉด์ ‘๊ด€์€ ๋งŒ์กฑํ–ˆ์ง€๋งŒ ๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ด ์ง€์‹์„ ์‹œํ—˜ํ•˜๋Š” ์‚ฌ๋žŒ์€ ์™œ ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค์ง€ ์•Š๋Š” ๊ฑธ๊นŒ? ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†๊ณ  ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ์œ  ๊ณต๊ฐ„์ด ์—†๋Š” ํŒŒํ‹ฐ์…˜์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์“ฐ๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ์ด๋ฏธ ์“ฐ์—ฌ์ง„ ๋ฐ์ดํ„ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์“ฐ๊ฑฐ๋‚˜ ์“ฐ๋ ค๊ณ  ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋„ ์žƒ์„ ์ˆ˜ ์—†๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”?

ํˆฌ ์ตํฌ

๊ฒฝ๋ ฅ ์ดˆ๊ธฐ์— ์ €๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž‘์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์ €๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ์ž๋ฅผ ๊ทธ์˜ ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์„์ง€ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Ivanov Ivan Ivanovich๊ฐ€ ์žˆ๊ณ  ๊ทธ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ๊ทธ๋“ค๊ณผ ์นœ๊ตฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” "Tuzik"์ด๋ผ๋Š” ๊ฐœ๊ฐ€ ๋ฐ”๋กœ ์ด Ivan์˜ ์†Œ์œ ๋ผ๋Š” ๊ฒƒ์„ ์ง์ ‘์ ์œผ๋กœ ์ง€์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฐ€ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  Ivan ๋Œ€์‹  Olya๊ฐ€ ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ Olya Ivanovna Ivanova๋Š” ๋” ์ด์ƒ ๊ฐœ๋ฅผ ๊ฐ–์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ ์šฐ๋ฆฌ Tuzik์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์กด์žฌํ•˜์ง€ ์•Š๋Š” Ivan์— ์†ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž(ID)๋ฅผ ๋ถ€์—ฌํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ๊ณ , ๋‚ด Tuzik์€ ์‹ค์ œ๋กœ ์ผ๋ จ๋ฒˆํ˜ธ์— ๋ถˆ๊ณผํ•œ ์ด ID์— ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—์ด์Šค์˜ ์†Œ์œ ์ž๋Š” ID ๋ฒˆํ˜ธ 2๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ณ  ์–ด๋Š โ€‹โ€‹์‹œ์ ์—์„œ Ivan์€ ์ด ID์— ์†ํ–ˆ๊ณ  Olya๋Š” ๋™์ผํ•œ ID์— ์†ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฅ˜์™€ ์ถ•์‚ฐ์—…์˜ ๋ฌธ์ œ๋Š” ์‹ค์งˆ์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์„ค๋ช…์ž

ํŒŒ์ผ์˜ ๋ฌธ์ œ์™€ ์ด ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ ๊ฐœ์™€ ์‚ฌ๋žŒ์˜ ๋ฌธ์ œ์™€ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค. ivan.txt๋ผ๋Š” ํŒŒ์ผ์„ ์—ด๊ณ  tuzik์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์“ฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ํŒŒ์ผ์— ์ฒซ ๊ธ€์ž "t"๋งŒ ์ผ๊ณ  ์ด ํŒŒ์ผ์˜ ์ด๋ฆ„์ด ๋ˆ„๊ตฐ๊ฐ€์— ์˜ํ•ด olya.txt๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒŒ์ผ์€ ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ๊ณ , ์—ฌ์ „ํžˆ ๊ทธ ํŒŒ์ผ์— ๋‚ด ์—์ด์Šค๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋กœ ํŒŒ์ผ์„ ์—ด ๋•Œ๋งˆ๋‹ค ์—ด ์ˆ˜ ์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋“  ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณ ์œ  ID๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด ID๋Š” ํŒŒ์ผ ์„ค๋ช…์ž์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์— ์ด ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ, ๋ˆ„๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์ „ํ˜€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๊ณ , ์†Œ์œ ์ž๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๋ฐ•ํƒˆํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์—ด ๋•Œ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ์—ˆ๊ณ  ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์†ํ•ด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Linux์—์„œ libc ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹คํ–‰ ์ค‘์ธ ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํ”„๋กœ์„ธ์Šค)์— ๋Œ€ํ•ด ๋ฒˆํ˜ธ๊ฐ€ 3์ธ 0,1,2๊ฐœ์˜ ์„ค๋ช…์ž ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋งํฌ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋‚จ์ž ์ŠคํŠœ๋””์˜ค ะธ ๋‚จ์ž ํ‘œ์ค€ ์ถœ๋ ฅ

  • ํŒŒ์ผ ์„ค๋ช…์ž 0์€ STDIN์ด๋ผ๊ณ  ํ•˜๋ฉฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ž…๋ ฅ๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ผ ์„ค๋ช…์ž 1์€ STDOUT์ด๋ผ๊ณ  ํ•˜๋ฉฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ธ์‡„ ๋ช…๋ น๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ผ ์„ค๋ช…์ž 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

๋ฆฌ๋””๋ ‰์…˜ ๋ฐ ํŒŒ์ดํ”„

์˜ˆ๋ฅผ ๋“ค์–ด ๋‘ ํ”„๋กœ์„ธ์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด bash๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—์„œ ์ด๋Ÿฌํ•œ 3๊ฐœ์˜ ์„ค๋ช…์ž ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ช…๋ น์„ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์  -f ๋‚ด๋ถ€์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋žตํ•˜๊ฒŒ ๋ง์”€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

PID 15771์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์œ„ bash ํ”„๋กœ์„ธ์Šค๋Š” ๋ช…๋ น์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ ค๋Š” ๋ช…๋ น ์ˆ˜๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” cat๊ณผ sleep์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ช…๋ น์ด ์žˆ์Šต๋‹ˆ๋‹ค. Bash๋Š” ๋‘ ๊ฐœ์˜ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ดํ”„๋กœ ๋ณ‘ํ•ฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด์ ์œผ๋กœ bash์—๋Š” 2๊ฐœ์˜ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์™€ XNUMX๊ฐœ์˜ ํŒŒ์ดํ”„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

clone์€ ๋ชจ๋“  ํŒŒ์ผ ์„ค๋ช…์ž์™€ ํ•จ๊ป˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œํ•˜๋ฏ€๋กœ ์ƒ์œ„ ํ”„๋กœ์„ธ์Šค์™€ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์—์„œ ๋™์ผํ•˜๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. PID 15771์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์œ„ ํ”„๋กœ์„ธ์Šค์˜ ์ž‘์—…์€ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋‹จ์ˆœํžˆ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํŒŒ์ดํ”„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ 3๋ฒˆ๊ณผ 4๋ฒˆ ํŒŒ์ผ ์„ค๋ช…์ž๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค.

PID 9004๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ•˜์œ„ bash ํ”„๋กœ์„ธ์Šค์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋“€2, STDOUT ํŒŒ์ผ ์„ค๋ช…์ž ๋ฒˆํ˜ธ 1์„ ํŒŒ์ดํ”„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ ์„ค๋ช…์ž๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๋ฒˆํ˜ธ 3์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ PID 9004๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ STDOUT์— ์“ฐ๋Š” ๋ชจ๋“  ๋‚ด์šฉ์€ ์ž๋™์œผ๋กœ ํŒŒ์ดํ”„ ๋ฒ„ํผ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

PID 9005์˜ ๋‘ ๋ฒˆ์งธ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์—์„œ bash๋Š” dup2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์„ค๋ช…์ž STDIN ๋ฒˆํ˜ธ 0์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ PID 9005์˜ ๋‘ ๋ฒˆ์งธ bash๊ฐ€ ์ฝ์„ ๋ชจ๋“  ๋‚ด์šฉ์€ ํŒŒ์ดํ”„์—์„œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.

๊ทธ ํ›„์—๋Š” 3๋ฒˆ๊ณผ 4๋ฒˆ ํŒŒ์ผ ์„ค๋ช…์ž๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์—์„œ๋„ ๋‹ซํž™๋‹ˆ๋‹ค.

ํŒŒ์ผ ์„ค๋ช…์ž 255๋Š” ์˜๋„์ ์œผ๋กœ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” bash ์ž์ฒด์—์„œ ๋‚ด๋ถ€ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์—์„œ๋„ ๋‹ซํž™๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ, PID 9004๋ฅผ ๊ฐ€์ง„ ์ฒซ ๋ฒˆ์งธ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์—์„œ bash๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ž„์› ๋ช…๋ น์ค„์—์„œ ์ง€์ •ํ•œ ์‹คํ–‰ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” /usr/bin/cat์ž…๋‹ˆ๋‹ค.

PID๊ฐ€ 9005์ธ ๋‘ ๋ฒˆ์งธ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์—์„œ bash๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ ๋‘ ๋ฒˆ์งธ ์‹คํ–‰ ํŒŒ์ผ(์ด ๊ฒฝ์šฐ /usr/bin/sleep)์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

exec ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ open ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ 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"

๋””์Šคํฌ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ฌธ์ œ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ดˆ๋‹น ์•ฝ 1MB๋ฅผ ๋””์Šคํฌ์— ์“ฐ๋Š” ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์–ด๋–ค ์ด์œ ๋กœ ๋””์Šคํฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์ž ์‹œ ํ›„์— ๋‹ค์‹œ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. 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์—์„œ ๋‹ค๋ฅธ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€์‹  ์ฝ”๋“œ์—์„œ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ณต๊ฐœ ํ˜ธ์ถœ์„ ์ฐพ์€ ์œ„์น˜ ์ฐธ์กฐ)์„ ์—ผ๋‘์— ๋‘๊ณ  ํŒŒ์ผ์„ ์—ด๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ O_WRONLY|O_CREAT| O_TRUNC ๋น„ํŠธ๋Š” ์ˆซ์ž ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์ปค๋„ ์†Œ์Šค๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์— ์–ด๋–ค ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ฌด์—‡์„ ๋‹ด๋‹นํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์„ธ์š”.

#O_WRONLY 00000001 ์ •์˜
#O_CREAT 00000100 ์ •์˜
#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

์šฐ๋ฆฌ๋Š” 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 

์ด์ œ ํŒŒ์ดํ”„์—์„œ ๋๋‚˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์ž๋™์œผ๋กœ netcat์˜ stdin์œผ๋กœ ์ด๋™ํ•˜์—ฌ ํฌํŠธ 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

์›๊ฒฉ์„œ๋ฒ„ ์›๊ฒฉ์„œ๋ฒ„.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์˜ ๋™๋ฃŒ๋“ค์—๊ฒŒ ์ธ์‚ฌ๋ฅผ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
Radio T ํŒŸ์บ์ŠคํŠธ๋ฅผ ๋“ค์–ด๋ณด์„ธ์š”.

๋ชจ๋‘์—๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

์ˆ™์ œ๋กœ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค ํŒŒ์ผ ์„ค๋ช…์ž cat ๋ฐ sleep์— ๋ฌด์—‡์ด ์žˆ์„์ง€ ์ƒ๊ฐํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€