ãã€ãŠãã€ã³ã¿ãã¥ãŒã§ããã£ã¹ã¯ã®å®¹éãäžè¶³ããããã«ãµãŒãã¹ãå£ããŠããã®ãèŠã€ãããã©ãããŸããããšå°ããããããšããããŸãã
ãã¡ãããç§ã¯ãã®å ŽæãäœãããŠããã®ãèŠãŠãå¯èœã§ããã°ãã®å Žæãæé€ãããšçããŸããã
次ã«ã€ã³ã¿ãã¥ã¢ãŒã¯ãããŒãã£ã·ã§ã³ã«ç©ºãé åããªãããã¹ãŠã®é åãå æãããã¡ã€ã«ã衚瀺ãããªãå Žåã¯ã©ããªãã®ããšå°ããŸããã
ããã«å¯ŸããŠãããšãã° lsof ã³ãã³ãã䜿çšããŠããã€ã§ãéããŠãããã¡ã€ã«èšè¿°åã確èªã§ããã©ã®ã¢ããªã±ãŒã·ã§ã³ãå©çšå¯èœãªã¹ããŒã¹ããã¹ãŠå æããŠããããææ¡ã§ããããŒã¿ãå¿ èŠãã©ããã«å¿ããŠç¶æ³ã«å¿ããŠè¡åã§ãããšè¿°ã¹ãŸããã ã
ã€ã³ã¿ãã¥ã¢ãŒã¯æåŸã®èšèã§ç§ã®è©±ãé®ããããã«è³ªåãå ããŸããããããŒã¿ã¯å¿ èŠãªããšããŸããããã¯åãªããããã° ãã°ã§ããããããã°ãæžã蟌ããªãããã¢ããªã±ãŒã·ã§ã³ãããŠã³ããŠããŸããã
ãããããŸããããšç§ã¯çããŸããããã¢ããªã±ãŒã·ã§ã³æ§æã§ãããã°ããªãã«ããŠãåèµ·åã§ããŸããã
é¢æ¥å®ã¯ãããããã¢ããªã±ãŒã·ã§ã³ãåèµ·åããããšã¯ã§ããŸãããã¡ã¢ãªã«ã¯éèŠãªããŒã¿ããŸã ãããéèŠãªã¯ã©ã€ã¢ã³ãã¯ãµãŒãã¹èªäœã«æ¥ç¶ãããŠããããã匷å¶çã«åæ¥ç¶ããããšã¯ã§ããŸãããããšåè«ããŸããã
ãããããŸããããšç§ã¯èšããŸããããã¢ããªã±ãŒã·ã§ã³ãåèµ·åã§ãããããŒã¿ãæ°ã«ããªãå Žåã¯ãls ã«ãã¡ã€ã«ã衚瀺ãããªããŠãããã¡ã€ã«èšè¿°åãä»ããŠãã®éããŠãããã¡ã€ã«ãã¯ãªã¢ã§ããŸããããã¡ã€ã« ã·ã¹ãã äžã®ã³ãã³ãã§ããã
é¢æ¥å®ã¯æºè¶³ããŠããŸããããç§ã¯ããã§ã¯ãããŸããã§ããã
ããã§ç§ã¯ããªãç§ã®ç¥èããã¹ããã人ã¯ããã«æ·±ã調ã¹ãããšããªãã®ããšèããŸããã ããããçµå±ã®ãšããããŒã¿ãéèŠã§ããå Žåã¯ã©ããªãã§ãããã? ããã»ã¹ãåèµ·åã§ãããåæã«ãã®ããã»ã¹ã空ãé åã®ãªãããŒãã£ã·ã§ã³äžã®ãã¡ã€ã« ã·ã¹ãã ã«æžã蟌ã¿ãè¡ã£ãå Žåã¯ã©ããªãã§ãããã? ãã§ã«æžã蟌ãŸããããŒã¿ã ãã§ãªãããã®ããã»ã¹ãæžã蟌ãã§ããããŸãã¯æžã蟌ãããšããŠããããŒã¿ã倱ãããªããšãããã©ããªãã§ãããã?
ãã¥ãžã¯
ç§ã®ãã£ãªã¢ã®åãã«ãç§ã¯ãŠãŒã¶ãŒã«é¢ããæ å ±ãä¿åããå¿ èŠãããå°ããªã¢ããªã±ãŒã·ã§ã³ãäœæããããšããŠããŸããã ããã§ç§ã¯ãã©ãããã°ãŠãŒã¶ãŒãšãã®ããŒã¿ãç §åã§ããã ããããšèããŸããã ããšãã°ãç§ã«ã¯ã€ã¯ããã»ã€ã¯ã³ã»ã€ã¯ããããããââãŠã圌ã¯ããã€ãã®ããŒã¿ãæã£ãŠããŸãããã©ãããã°åœŒããšåéã«ãªãããšãã§ããŸããïŒ ããã¥ãžã¯ããšããååã®ç¬ããã®åãã€ã¯ã³ã®ãã®ã§ããããšãçŽæ¥ææã§ããŸãã ãããããã圌ãååãå€ããŠãã€ã¯ã³ã§ã¯ãªããäŸãã°ãªãŒãªã€ã«ãªã£ããã©ããªãã§ããããïŒ ãã®åŸãç§ãã¡ã®ãªãªã€ã»ã€ã¯ãããã»ã€ã¯ãã¯ã¯ããç¬ã飌ã£ãŠããªãããšãå€æããç§ãã¡ã®ãã¥ãžã¯ã¯äŸç¶ãšããŠååšããªãã€ã¯ã³ã«å±ããŸãã ããŒã¿ããŒã¹ã¯ãã®åé¡ã®è§£æ±ºã«åœ¹ç«ã¡ãåãŠãŒã¶ãŒã«äžæã®èå¥å (ID) ãäžããããç§ã® Tuzik ã¯ãã® ID (å®éã«ã¯åãªãã·ãªã¢ã«çªå·) ã«é¢é£ä»ããããŠããŸããã ãããã£ãŠãtuzik ã®ææè 㯠ID çªå· 2 ãæã¡ãããæç¹ã§ Ivan ããã® ID ã®äžã«ããããã®åŸ Olya ãåã ID ã®äžã«ãªããŸããã 人é¡ãšçç£ã®åé¡ã¯å®è³ªçã«è§£æ±ºãããŸããã
ãã¡ã€ã«èšè¿°å
ãã¡ã€ã«ãšãã®ãã¡ã€ã«ãæäœããããã°ã©ã ã®åé¡ã¯ãç¬ãšäººéã®åé¡ãšã»ãŒåãã§ãã ivan.txt ãšããååã®ãã¡ã€ã«ãéããŠãtuzik ãšããåèªãæžãå§ãããã®ã®ãæåã®æåãtãã ãããã¡ã€ã«ã«æžã蟌ãããšãã§ãããã®ãã¡ã€ã«ã®ååã誰ãã«ãã£ãŠãããšãã° olya.txt ã«å€æŽããããšããŸãã ãããããã¡ã€ã«ã¯åããªã®ã§ããšãŒã¹ãããã«æžã蟌ã¿ãããšæã£ãŠããŸãã ã·ã¹ãã ã³ãŒã«ã§ãã¡ã€ã«ãéããã³ã«
Linux ã§ã¯ãlibc ã©ã€ãã©ãªã¯ãå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ (ããã»ã¹) ããšã«ãçªå· 3ã0,1,2ãXNUMX ã® XNUMX ã€ã®èšè¿°åãã¡ã€ã«ãéããŸãã 詳现ã«ã€ããŠã¯ãªã³ã¯ãã芧ãã ãã
- ãã¡ã€ã«èšè¿°å 0 㯠STDIN ãšåŒã°ããã¢ããªã±ãŒã·ã§ã³å ¥åã«é¢é£ä»ããããŸãã
- ãã¡ã€ã«èšè¿°å 1 㯠STDOUT ãšåŒã°ããå°å·ã³ãã³ããªã©ã®åºåã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠäœ¿çšãããŸãã
- ãã¡ã€ã«èšè¿°å 2 㯠STDERR ãšããååã§ãã¢ããªã±ãŒã·ã§ã³ããšã©ãŒ ã¡ãã»ãŒãžãåºåããããã«äœ¿çšããŸãã
ããã°ã©ã å ã§èªã¿åããŸãã¯æžã蟌ã¿ã®ããã«ãã¡ã€ã«ãéããå Žåãããããæåã®ç¡æ ID ãååŸãããããã 3 çªç®ã«ãªããŸãã
PID ãããã£ãŠããå Žåã¯ãããã»ã¹ã®ãã¡ã€ã«èšè¿°åã®ãªã¹ãã衚瀺ã§ããŸãã
ããšãã°ãbash ã§ã³ã³ãœãŒã«ãéããŠããã»ã¹ã® PID ã確èªããŠã¿ãŸãããã
[user@localhost ]$ echo $$
15771
XNUMX çªç®ã®ã³ã³ãœãŒã«ã§æ¬¡ãå®è¡ããŸãã
[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 ã€ã®èšè¿°åãã¡ã€ã«ãã¹ãŠãæ¬äŒŒç«¯æ«ããã€ã¹ã«é¢é£ä»ããããŸããã
[user@localhost ]$ echo "hello world" > /proc/15771/fd/0
ãããŠæåã®ã³ã³ãœãŒã«ã«è¡šç€ºãããã®ã¯ã
[user@localhost ]$ hello world
ãªãã€ã¬ã¯ããšãã€ã
ããã 3 ã€ã®èšè¿°åãã¡ã€ã«ã¯ãbash ãå«ãä»»æã®ããã»ã¹ã§ãããšãã° XNUMX ã€ã®ããã»ã¹ãæ¥ç¶ãããã€ã (ãã€ã) ãéããŠç°¡åã«ãªãŒããŒã©ã€ãã§ããŸãã
[user@localhost ]$ cat /dev/zero | sleep 10000
ãã®ã³ãã³ãã¯èªåã§å®è¡ã§ããŸã strace -f å éšã§äœãèµ·ãã£ãŠããã®ãèŠãŠã¿ãŸããããããããããã¯æçã«ããŸãã
PID 15771 ã®èŠª bash ããã»ã¹ã¯ã³ãã³ãã解æããå®è¡ããã³ãã³ãã®æ°ãæ£ç¢ºã«ç解ããŸãããã®å Žåããã®ãã¡ã® 2 ã€ã¯ cat ãš sleep ã§ãã Bash ã¯ãXNUMX ã€ã®åããã»ã¹ãäœæãããããã XNUMX ã€ã®ãã€ãã«ããŒãžããå¿ èŠãããããšãèªèããŠããŸãã åèšãããšãbash ã«ã¯ XNUMX ã€ã®åããã»ã¹ãš 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
次ã«ãã·ã¹ãã ã³ãŒã«ã䜿çšããŠã
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 åããã»ã¹ã§ã¯ãã·ã¹ãã ã³ãŒã«
PID 9005 ã® 2 çªç®ã®åããã»ã¹ã§ã¯ããã¡ã€ã«ã STDIN èšè¿°åçªå· 0 ã« bash dup9005s ããŸããããã§ãPID XNUMX ã® XNUMX çªç®ã® bash ãèªã¿åããã®ã¯ãã¹ãŠãã€ãããèªã¿åãããŸãã
ãã®åŸãçªå· 3 ãš 4 ã®ãã¡ã€ã«èšè¿°åã䜿çšãããªããªã£ããããåããã»ã¹ã§éããããŸãã
ãã¡ã€ã«èšè¿°å 255 ã¯æå³çã«ç¡èŠããŸãããã㯠bash èªäœã«ãã£ãŠå éšçã«äœ¿çšãããåããã»ã¹ã§ãéããããŸãã
次ã«ãPID 9004 ã®æåã®åããã»ã¹ã§ãbash ãã·ã¹ãã ã³ãŒã«ã§éå§ãããŸãã
PID 9005 ã® XNUMX çªç®ã®åããã»ã¹ã§ã¯ãbash ã¯æå®ãã XNUMX çªç®ã®å®è¡å¯èœãã¡ã€ã« (ãã®å Žå㯠/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
ã芧ã®ãšããããã€ãã®äžæã®çªå·ã¯äž¡æ¹ã®ããã»ã¹ã§åãã§ãã ãããã£ãŠãåã芪ãæ〠XNUMX ã€ã®ç°ãªãããã»ã¹éã«æ¥ç¶ãååšããŸãã
bash ã䜿çšããã·ã¹ãã ã³ãŒã«ã«è©³ãããªã人ã«ã¯ã次ã®ããã« strace ãéããŠã³ãã³ããå®è¡ããå éšã§äœãèµ·ãã£ãŠãããã確èªããããšã匷ããå§ãããŸãã
strace -s 1024 -f bash -c "ls | grep hello"
ãã£ã¹ã¯å®¹éãäžè¶³ããããã»ã¹ãåèµ·åããã«ããŒã¿ãä¿åããããšããåé¡ã«æ»ããŸãããã 1 ç§ãããçŽ XNUMX ã¡ã¬ãã€ãã®é床ã§ãã£ã¹ã¯ã«æžã蟌ãå°ããªããã°ã©ã ãæžããŠã¿ãŸãããã ããã«ãäœããã®çç±ã§ããŒã¿ããã£ã¹ã¯ã«æžã蟌ããªãã£ãå Žåã¯ããããç¡èŠããŠãããã«å床ããŒã¿ã®æžã蟌ã¿ãè©Šã¿ãŸãã ãã®äŸã§ã¯ 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 ã€ã®æšæºãã¡ã€ã«èšè¿°åãšãéãããã XNUMX ã€ã®ãã¡ã€ã«èšè¿°åããããŸãã ãã¡ã€ã«ãµã€ãºã確èªããŠã¿ãŸãããã
[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
ã芧ã®ãšããããã¡ã€ã« ãµã€ãºã¯å¢å ããã ãã§ããã©ã³ã¯ã¯æ©èœããŸããã§ããã ã·ã¹ãã ã³ãŒã«ã«é¢ããããã¥ã¡ã³ãã«ç§»ããŸããã
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 ãããã¯æ°å€ã«çœ®ãæããããŸãã ãããè¡ãã«ã¯ã次ã®ãããªã«ãŒãã« ãœãŒã¹ãéããŸãã
#define O_WRONLY 00000001
#define O_CREAT 00000100
#define O_TRUNC 00001000
ãã¹ãŠã®å€ã 00001101 ã€ã«çµåãããšãXNUMX ãåŸãããŸã
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
ãªã¢ãŒããµãŒããŒ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 ã®ååã«ãæšæ¶ãããŠããã ããŸãã
Radio-T ããããã£ã¹ããèããŠãã ããã
ãã¹ãŠè¯ãã§ãã
宿é¡ãšããŠã次ã®ã³ãã³ããå®è¡ããå Žåã« cat ããã»ã¹ãš sleep ããã»ã¹ã®ãã¡ã€ã«èšè¿°åã«äœãå«ãŸããããèããŠã¿ãããšãææ¡ããŸãã
[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000
åºæïŒ habr.com