ååã¾ã§ã®ç¶ããなるほどUnixプロセス ― Rubyで学ぶUnixの基礎 - 達人出版会ãã¾ã èªãã§ãããé èªã
ä»åã¯ãUnixããã»ã¹ã¨ã·ã°ãã«ã®åºç¤ã«ã¤ãã¦å確èªãã¦ããã
- Unixã·ã°ãã«ã»äºå§ã
- Unixã·ã°ãã«ã®ãããã¯ã
- ã·ã°ãã«ãåå®ç¾©ãã
- ã·ã°ãã«ãã³ããªã³ã°ã®æ³¨æç¹
Unixã·ã°ãã«ã»äºå§ã
ååãåããã»ã¹ã®çµäºãå¾
ã¡åããã®ã«ç¨ãã Process.wait
ã¯ãå®è¡ããã¨ããã§èªèº«ï¼è¦ªããã»ã¹ï¼ã®å¦çãæ¢ãã¦åããã»ã¹ã®çµäºãå¾
ã£ãããã㯠ããããã³ã°å¼ã³åºã
ã¨å¼ã°ããã
ã§ã¯ã親ã¯è¦ªã§ä½ãå¥ã®ä»äºããããã¨ããã¯ã©ããããã¨ããã¨ãããããè¦ã¦ããã·ã°ãã«ã䏿ã«ä½¿ãã¨å®ç¾ã§ããã
ä»åã¯ãããªãå ·ä½çãªã³ã¼ãããè¦ã¦ã¿ãã
child_processes = 3 dead_processes = 0 # åãããã»ã¹ã 3 ã¤çæãã child_processes.times do fork do # ããããã 3 ç§é sleep ããã sleep 3 end end # ãã®å¾ã親ãããã»ã¹ã¯éãè¨ç®å¦çã¦ãå¿ãããªãããã # åãããã»ã¹ã®çµäºã¯æ¤ç¥ãããã # ããã¦ãã:CHLD ã·ã¯ããã«ãææï¼trapï¼ããããããããã¨ã¦ã # åãããã»ã¹ã®çµäºæã«ã«ã¼ãã«ããã®éç¥ãåä¿¡ã¦ãããã trap(:CHLD) do # çµäºããåãããã»ã¹ã®æ å ±ã Process.wait ã¦ãåå¾ããã¯ãã # çæããåãããã»ã¹ã®ã¨ããããçµäºããã®ããããããã puts Process.wait dead_processes += 1 # ãã¸ãã¦ã®åãããã»ã¹ããçµäºããæç¹ã¦ãæç¤ºçã«è¦ªãããã»ã¹ãçµäºãããã exit if dead_processes == child_processes end # éãè¨ç®å¦ç loop do (Math.sqrt(rand(44)) ** 8).floor sleep 1 end
ãã®ã³ã¼ãã«ããããUnixã·ã°ãã«ãã¯ã:CHLD
ãããã
ã·ã°ãã«ï¼ä¿¡å·ï¼ã«ã¯è²ããªç¨®é¡ããã£ã¦ããã®ä¸ã§ã :CHLD
ã¯ãåãããã»ã¹ï¼CHILDï¼ã®çµäºæã«ã«ã¼ãã«ããéãããã·ã°ãã«ãã¨æã£ã¦ããããã ãï¼åèï¼http://www.oki-osk.jp/esc/linux/signal-5.htmlï¼
ãã ãã®ä¿¡å·ã¯æå³çã»æç¤ºçã«ææï¼åä¿¡ï¼ãããã¨ããªããã°åä¿¡ã§ããªãããããè¡ãã®ã trap
ãã¨ãããã¨ãã
ããå°ãã³ã¼ããè¦ãããåããã»ã¹ãçµäºãããã¨ããã·ã°ãã«ãåãã¦åã㦠Process.wait
ããã®ã§ã親ããã»ã¹ã®å¾
ã¡æéãæå°ã«ãããã¨ãã§ãããã¨ãããã¨ãããªãã»ã©ã
ãµã¨æã£ããã©ããã® trap
ãããã¯ã®å®è¡ãè¡ã£ã¦ããéã¯è¦ªããã»ã¹ã®å¦çã¯ã©ããªããã ããï¼ trap
å¦çãå²ãè¾¼ãå½¢ã«ãªã£ã¦ã親ããã»ã¹ã®ãéãè¨ç®å¦çãã¯ä¸æçã«ã¹ãããããã®ããªï¼
æ¬æ¸ã®æµãããã¯å°ãå¤ãããã¨ã«ãªããã©ãã¡ãã£ã¨ããæ¤è¨¼ã³ã¼ããæ¸ãã¦è©¦ãã¦ã¿ãã
child_processes = 3 dead_processes = 0 sleep_second = 5 child_processes.times do fork do # ããããã sleep ããã sleep sleep_second end # åããã»ã¹ãã¨ã«ç§æ°ã伸ã°ãã # ããã«ãããtrap ã®å¦çãçµãã£ãã親ããã»ã¹ã®å¦çã«æ»ãç¶äºãä¸ããããã sleep_second += 5 end trap(:CHLD) do puts "This child process pid is #{Process.wait}" dead_processes += 1 # trapãããã¯ã®å¦çã親ããã»ã¹ã«ã©ã®ãããªå½±é¿ãä¸ããã®ãã # ããããããããããã«ã3ç§éã®ã¹ãªã¼ããæã sleep 3 end # 親ããã»ã¹ã¯1ç§ãã¨ã«ã«ã¦ã³ããã¦ããã仮㫠trap ãããã¯ã®å¦çãåªå ãããããã㨠# ãã®éã®è¦ªããã»ã¹ã®ã«ã¦ã³ãåºåã¯è¡ãããªãã¯ã parent_count = 0 loop do puts "Parent Counter : #{parent_count}" parent_count += 1 sleep 1 if dead_processes == child_processes puts "Child processes are all finished!" exit end end
確èªããããã¨ã¯ã³ã¡ã³ãã«æ¸ãã¦ããã®ã§ããã£ã¦ããããã¨æãã
ãã®ã³ã¼ããå®è¡ããçµæã¯ä»¥ä¸ã
Parent Counter : 0 Parent Counter : 1 Parent Counter : 2 Parent Counter : 3 Parent Counter : 4 This child process pid is 84810 Parent Counter : 5 Parent Counter : 6 This child process pid is 84811 Parent Counter : 7 Parent Counter : 8 This child process pid is 84812 Child processes are all finished!
å
¨ã¦åºåããããã¨ã®çµæã ããè¦ã¦ããããã«ããã¨æããã©ãThis child process pid is
ã表示ããã¦ããã®3ç§éã®ã¹ãªã¼ãã®éã¯ãParent Counter
ã®åºåã¯è¡ãããªãã£ããã¤ã¾ããtrap
ã®å¦çãå²ãè¾¼ã¿ã親ããã»ã¹ã§ã®å¦çã䏿ãã¦ããã£ã¦ãã¨ã«ãªãã
ã¾ããChild processes are all finished!
ã®åã« Parent Counter
ã®åºåããªãã®ã§ãã¤ã¾ãã
sleep 1
ã®ã¹ãªã¼ãããã¦ããæä¸ã«ã·ã°ãã«ãææããã®ã§trap
ã®å¦çãè¡ãã- ãããçµãã£ããã¾ã
sleep 1
ã®ã¹ãªã¼ãå¦çã®ç¶ãã«æ»ã£ã
ã¨ããæåãåã£ã¦ãããã¨ããããããã£ãããã¡ãªã¿ã«ããã§åºã¦ãã trap
ã¯ãsigaction(2)
ã«å¤§çã§å¯¾å¿ãã¦ãããã¨ã®ãã¨ã
è©±ãæ¬ã«æ»ãã¨ããã®ãã·ã°ãã«ã®é
ä¿¡ããå®å
¨ã«ä¿¡é ¼ã§ãããã®ã§ã¯ãªããã ããã ããã¨ãã°ããã :CHLD
ã·ã°ãã«ãå¦çãã¦ããéã«å¥ã®åãããã»ã¹ããçµäºããå ´åãæ¬¡ã® :CHLD
ã·ã¯ããã«ãææã¦ããããã¨ãããã¯ãã®ä¿è¨¼ããªããããã
ãã ããã¯åã種é¡ã®ã·ã°ãã«ãç«ã¦ç¶ãã«åä¿¡ããå ´åï¼ä»åã®ã³ã¼ãä¾ã ã¨ãè¤æ°ã®åããã»ã¹ãç¬éçã«é£ç¶ãã¦çµäºããå ´åï¼ã«ã ãèµ·ãããã¨ããã ãå°ãªãã¨ã1åã®ã·ã°ãã«ã®ææã¯ã§ãããã¤ã¡ã¼ã¸çã«ã¯ãææãã¦ããéã«å¥ã®ã·ã°ãã«ã«æ¥ããã¦ãããã㯠trap
ã§ããªãããã¨ããæãããªã
æ¬æ¸ã§ã¯ããã®ãããªç¶æ³ã«ã©ã䏿ã«å¯¾å¿ããããã«ã¤ãã¦ãæ¸ããã¦ãããèªã¿é²ããåã«èªåã®é ã®ä¸ã§ãçãèãã¦ã¿ããã±ã£ã¨æãã¤ãã®ã¯ trap
ãããã¯å
ã§ã念ã®ããã« Process.wait
ãã«ã¼ãããã¦äºæãã¬åããã»ã¹ã®çµäºãå¾
ã¡åãããã¨ããã®ãããã¨æããã©ã Process.wait
ã¯ãããããã³ã°å¼ã³åºãããªã®ã§ãããããã¦ãã¾ãã¨ã·ã°ãã«ã trap ãã¦ããæå³ããªããªã£ã¦ãã¾ãã...æ¬ã«ç®ãæ»ãã¨åæ§ã®ãã¨ãæ¸ãã¦ãã£ãã
ãªãã»ã©ãã¼ãã©ããããããªãã¨æã£ã¦ããã«æ¬ãèªã¿é²ãã¦ã¿ãã¨ãå®ã¯ Process.wait
ã«ã¯ç¬¬2弿°ããã£ã¦ãã©ã°ã渡ããã¨ããã®ãã©ã°ã«ãã£ã¦ããçµäºãå¾
ã¤åããã»ã¹ããªããã°ãããã¯ããªããããã«ã«ã¼ãã«ã«æç¤ºããããã¨ãã§ãããã ããã ãããããï¼ï¼ï¼
ãã®ä½¿ãæ¹ã¯âãããªãããã
Process.wait(-1, Process::WNOHANG)
第1弿°ã® -1
ã¯ååå¦ãã ã¨ããããããããã²ã¨ã¤ã®åããã»ã¹ãå¾
ã¡åãããã¨ããæå³ãªã®ã§ãä¸è¨ã®å¼ã³åºãã¯ãããããã²ã¨ã¤ã®åããã»ã¹ãå¾
ã¡åãããã©ããã®æç¹ã§çµäºãå¾
ã¤åããã»ã¹ï¼ãã¥ã¼ã«å
¥ã£ã¦ããåããã»ã¹ï¼ããªãããã°ãããã¯ããªã
ã¨ããæå³ã«ãªãããªãã»ã©ããããã
ãããè¸ã¾ããã¨å ã»ã©ã®ã³ã¼ãã¯ããâãªãã
child_processes = 3 dead_processes = 0 # åãããã»ã¹ã 3 ã¤çæãã child_processes.times do fork do # ããããã 3 ç§é sleep ããã sleep 3 end end # CHLD ãã³ããã©ã®ä¸ã¦ã puts ã®åºåãããããã¡ãªã³ã¯ãããªãããã # $stdout ã®åºåãåæã¢ã¼ããã«è¨å®ããã # ãããããã¨ã¦ãããã puts ãå¼ã²ãåºããå¾ã«ã·ã¯ããã«ãã³ããã©ãã # 䏿ãããå ´åã«ã¯ ThreadError ä¾å¤ããéåºãããããã«ãªãã # ããã¯ã·ã¯ããã«ãã³ããã©ã¦ã IO ãæ±ãå ´åã®ä¸è¬çãªæµåãããã $stdout.sync = true # ãã®å¾ã親ãããã»ã¹ã¯éãè¨ç®å¦çã¦ãå¿ãããªãããã # åãããã»ã¹ã®çµäºã¯æ¤ç¥ãããã # ããã¦ãã:CHLD ã·ã¯ããã«ãææï¼trapï¼ããããããããã¨ã¦ã # åãããã»ã¹ã®çµäºæã«ã«ã¼ãã«ããã®éç¥ãåä¿¡ã¦ãããã trap(:CHLD) do # çµäºããåãããã»ã¹ã®æ å ±ã Process.wait ã¦ãåå¾ããã¯ãã # çæããåãããã»ã¹ã®ã¨ããããçµäºããã®ããããããã # Process.wait(-1, Process::WNOHANG) ãã«ã¼ããããããã¨ã¦ãã # 親ããã»ã¹ã®å¦çããããã¯ããããã¨ãªãåãããã»ã¹ã®çµäºãè¦éããªãããã«ããã begin while pid = Process.wait(-1, Process::WNOHANG) puts pid dead_processes += 1 end rescue Errno::ECHILD # ã«ã¼ãã«ã®çµäºãã¥ã¼ã空ã§ããã°å¾ ã¡åãã®ã«ã¼ããçµäºãã end end # éãè¨ç®å¦ç loop do (Math.sqrt(rand(44)) ** 8).floor sleep 1 end
ãªãã»ã©ãProcess.wait(-1, Process::WNOHANG)
ã¯ãããã¯ã¯ããªããã©ããã¥ã¼ã空ã ã£ãã¨ãã® Errno::ECHILD
ä¾å¤ã¯ã¡ããã¨æãã¦ãããã®ãã
Unixã·ã°ãã«ã®ãããã¯ã
ãããªãã·ã°ãã«ã使ã£ãåããã»ã¹ã®å¾å§æ«ã«ã¤ãã¦ã®å®è£ ãè¦ããã¨ã«ãªã£ãããããã¾ã§è¦ã¦ããã¨ããã·ã°ãã«ã¯ãããç¹å®ã®ããã»ã¹ããå¥ã®ããã»ã¹ã¸ã¨éããããã®ã§ãããããã¦ã2ã¤ã®ããã»ã¹ã仲ä»ããã®ãã«ã¼ãã«ã ã
ããã»ã¹ã¯ãã«ã¼ãã«ããã·ã°ãã«ãåããã¨ãã
- ã·ã°ãã«ãç¡è¦ãã
- ç¹å®ã®å¦çãè¡ã
- ããã©ã«ãã®å¦çãè¡ã
ã®ãããããã®å¦çãè¡ãã
ããã¯ä¾ãã°ãCHLD
ã·ã°ãã«ã trap ããã³ã¼ãã«ããããã»ã¹ã§ããã°ãç¹å®ã®å¦çãè¡ãã£ããã¨ã«ãªããã£ã¦ãã¨ã§ããã®ããªã
ããã¾ã§ã¯ CHLD
ã·ã°ãã«ããæ±ã£ã¦ããªãã£ããããUnixã·ã¹ãã ä¸ã§ä¸è¬çãµãã¼ãããã¦ããã·ã°ãã«ãã¨ãããã®ããããããã以ä¸ã®è¡¨ã
ã·ã°ãã« | çªå· | ã¢ã¯ã·ã§ã³ | 説æ |
---|---|---|---|
SIGHUP | 1 | Term | å¶å¾¡ç«¯æ«ã®ãã³ã¯ãã¢ããããã¾ãã¯å¶å¾¡ãã¦ãããããã»ã¹ã®æ»ã®æ¤åº |
SIGINT | 2 | Term | ãã¼ããã¼ããããã®å²ã込㿠|
SIGQUIT | 3 | Core | ãã¼ããã¼ããã«ãã䏿¢ |
SIGILL | 4 | Core | 䏿£ãªå½ä»¤ |
SIGABRT | 6 | Core | abort(3) ããã®ä¸æã·ã¯ããã« |
SIGFPE | 8 | Core | æµ®åå°æ°ç¹ä¾å¤ |
SIGKILL | 9 | Term | Kill ã·ã¯ããã« |
SIGSEGV | 11 | Core | 䏿£ãªã¡ã¢ãªåç § |
SIGPIPE | 13 | Term | ããã¤ããç ´å£: èªã¿æã®ç¡ãããã¤ããã¸ã®æ¸ãåºã |
SIGALRM | 14 | Term | alarm(2) ããã®ã¿ã¤ãã¼ã·ã¯ããã« |
SIGTERM | 15 | Term | çµäºã·ã¯ããã« |
SIGUSR1 | 30,10,16 | Term | ã¦ã¼ãµãå®ç¾©ã·ã¯ããã« 1 |
SIGUSR2 | 31,12,17 | Term | ã¦ã¼ãµãå®ç¾©ã·ã¯ããã« 2 |
SIGCHLD | 20,17,18 | Ign | åãããã»ã¹ã®ä¸æåæ¢ã¾ãã¯çµäº |
SIGCONT | 19,18,25 | Cont | 䏿忢ããã®åé |
SIGSTOP | 17,19,23 | Stop | ãããã»ã¹ã®ä¸æåæ¢ |
SIGTSTP | 18,20,24 | Stop | 端æ«ããå ¥åããã䏿忢 |
SIGTTIN | 21,21,26 | Stop | ãããã¯ã¯ãã©ã³ãããããã»ã¹ã®ç«¯æ«å ¥å |
SIGTTOU | 22,22,27 | Stop | ãããã¯ã¯ãã©ã³ãããããã»ã¹ã®ç«¯æ«åºå |
ãã®è¡¨ä¸ã®ãã¢ã¯ã·ã§ã³ãåã®å 容ãããã®ããã»ã¹ã®ãããã©ã«ãã®å¦çãããããå ·ä½çãªå¦çå 容ã¯ä»¥ä¸ã®éãã
ã¢ã¯ã·ã§ã³å | å¦çå 容 |
---|---|
Term | ããã»ã¹ãããã«çµäºããã |
Core | ããã»ã¹ãããã«çµäºãããã³ã¢ããã³ããã |
Ign | ããã»ã¹ã¯ã·ã°ãã«ãç¡è¦ãã |
Stop | ããã»ã¹ã忢ããã |
Cont | ããã»ã¹ã復帰ããã |
ã³ã¢ããã³ããã
ã¨ã¯ããã®å¾ã®èª¿æ»ã ã¨ãã®ããã«ããã®æç¹ã®ä½¿ç¨ä¸ã¡ã¢ãªã®å
容ããã®ã¾ã¾ããã¹ããã¡ã¤ã«ãªã©ã«åºåãããã¨ã
ãããã®ã·ã°ãã«ã Ruby ã®ã³ã¼ãã§éä¿¡ããã«ã¯ã©ããããã¨ããã¨ãProcess.kill(<ã·ã°ãã«ã·ã³ãã«>, <éãããããã»ã¹ã®pid>)
ã¨ããã°è¯ãããªã®ã§ä¾ãã°ã pid 12345
ã®ããã»ã¹ã kill ããããã¨ãã£ãã¨ãã«ã¯ Process.kill(:KILL, 12345)
ã¨ããã
Process.kill
ã¯ãkill(2)
ã«å¯¾å¿ãã¦ãããä»ã¾ã§ã®çµé¨ã§ããããããã»ã¹ã殺ãããã¨ãã«ã¯ kill -9 12345
ãªãã¦ãã£ã¦ãããã©ããªãã»ã©ããã® kill
ã¨ããã³ãã³ãã¯ããã»ã¹ã殺ãããã®ãã®ã§ã¯ãªãã¦ããç¹å®ã®ã·ã°ãã«ãéããã¨ããã®ãæ¬æ¥ã®ä½¿ãæ¹ãªããã ï¼æä½æ¥ã§ããã»ã¹ã«ã·ã°ãã«ãéããããªã¨ãã¯å¤§ä½ããã®ããã»ã¹ã殺ãããã¨ããªããã ãã©...ï¼ã
ã¡ãªã¿ã«ã·ã°ãã«ãæå®ããã¨ããã·ã°ãã«åã®ãSIGãã®é¨åã¯å¿ ãããæå®ããªãã¦ããããã ããã ã
ã·ã°ãã«ãåå®ç¾©ãã
ããã»ã©ã®è¡¨ã« SIGUSR1
㨠SIGUSR2
ã¨ãããã¦ã¼ãµã¼å®ç¾©ã·ã°ãã«
ã¨ããã·ã°ãã«ãããããã®2ã¤ã®ã·ã°ãã«ã¯ãã¦ã¼ã¶ã¼ãèªç±ã«ç¨éãæ±ºãã¦ç¨ããï¼ã¦ã¼ã¶ã¼ãåå®ç¾©ããï¼ããã«ç¨æããã¦ãããã®ãããã
ããããã®åå®ç¾©ã¯ã©ãããã®ãã¨ããã¨ãæ¢ã«ããã¾ã§ã«ç¥ãå¾ãæ¹æ³ã§ã§ãããtrap
ã ã
ã·ã°ãã«ã®åå®ç¾©ãè¡ãã¨ããã®ã¯ã¤ã¾ããããã®ããã»ã¹ã§ç¹å®ã®ã·ã°ãã«ãåããã¨ãã«ã©ãæ¯ãèãããããã¨ãããã¨ã«ã»ããªããªãã
ãã¨ãã°âãã®ããã« SIGUSR1
ã trap
ãã¦ããã¨ã
trap(:USR1) { print "å æ°ãããã°ä½ã§ãåºæ¥ã" }
ãã¡ã¾ã¡ããã®ããã»ã¹ã«ã¨ã£ã¦ SIGUSR1
ã¨ããã·ã°ãã«ã¯ãæ ¹æ§ã¡ãã»ã¼ã¸ã表示ãããããã®ã·ã°ãã«ã¨å¤ããã
å®ã¯ãtrap
ã§åå®ç¾©ã§ããã®ã¯ã¦ã¼ã¶ã¼å®ç¾©ã·ã°ãã«ã ãã§ã¯ãªãã£ãããããtrap(:USR1)
ã trap(:INT)
ã¨ããã°ãSIGINT
ã«å¯¾ãã¦ãåæ§ã®æåãåããããã¨ãã§ããããã«ãªãã
ãããå
¨ã¦ã®ã·ã°ãã«ã«ã¤ãã¦åå®ç¾©ã§ããã®ãã¨ããã¨ãSIGKILL
㨠SIGSTOP
ã ãã¯ã§ããªã...ã¨ããããããããææï¼ trap
ï¼ã§ããªãããã«ãªã£ã¦ãããã©ããªã«ãã®ããã»ã¹ï¼ã®ããã®ã³ã¼ãï¼ãéæ¹é ããããã¨ããããã·ã°ãã«ã«ã¤ãã¦åå®ç¾©ãã¦ããã¨ãã¦ã»ã¾ããã®ããã»ã¹ãæ´èµ°ããã¨ãã¦ãããããã®ã·ã°ãã«ã ãã¯æå¾ã®ç ¦ã¨ãã¦æ®ã£ã¦ããã®ã§ãããã¨ãªãã°ãã®ã·ã°ãã«ãéããã¨ã§ããã»ã¹ãçµäºããããã¨ãã§ãããã¨ããããããã
ã¡ãªã¿ã«ãããâæ¸ãã¨ããã®ã·ã°ãã«ãç¡è¦ã§ããããã«ãªãã
trap(:INT, "IGNORE")
ãããã²ã¨ã¤ã®ãã·ã°ãã«ã®åå®ç¾©ãã ã¨æãããã¡ãã SIGKILL
㨠SIGSTOP
ã«ã¯ãã®ç¡è¦ãããããããªåå®ç¾©ãè¡ããã¨ã¯ã§ããªãã
ã·ã°ãã«ãã³ããªã³ã°ã®æ³¨æç¹
trap
ã®ãããªãã·ã°ãã«ãææãä½ããã®å¦çãè¡ãã³ã¼ãã®ãã¨ã ã·ã°ãã«ãã³ãã©
ã¨å¼ã¶ãã·ã°ãã«ãã³ãã©ã trap
ã§æ¸ãã¨ãã®æ³¨æç¹ã¯ããã®å®ç¾©ã¯ãã®ããã»ã¹ã«ããã¦ã°ãã¼ãã«ãªãã®ã§ãããã¨ãããã¨ã
trap
ã§ã®ã·ã°ãã«ãã³ãã©ã¯ trap(<ã·ã°ãã«>) { ... }
ã¨ããæ¸ãæ¹ã«ãªãã®ã§ãããã·ã°ãã«ã«ã¤ãã¦æå¹ãªã·ã°ãã«ãã³ãã©ã¯ããã®ããã»ã¹ã«ããã¦2ã¤ä»¥ä¸ã¯åå¨ãå¾ãªãï¼ã©ã¡ãããã©ã¡ããã䏿¸ãããï¼ãã¨ãããã¨ã«ãªãã
ã§ã¯ä¾ãã°ã
- å®è¡ãããã¨ãã Ruby ã³ã¼ãã®ã©ããã§
INT
ã®ã·ã°ãã«ãã³ãã©ãå®ç¾©ããã¦ãããã - ããã§ã®æ¢åã®å¦çãè¸ã¿ã«ãããã¨ãªããæ°ããªå¦çãä»ãå ããã
ãããªã¨ãã¯ã©ãããã°ããããæ¬ã®ä¸ã§ã®åçã以ä¸ã
# ãããæ¢åã® INT ã·ã°ãã«ãã³ãã©ã¨ã¿ãªã trap(:INT) { puts 'This is the first signal handler' } # æ¢åã®ãã³ãã©ã®å¦çãè¸ã¿ã«ãããã¨ãªããæ°ããªå¦çãä»ãå ãã old_handler = trap(:INT) { old_handler.call puts 'This is the second handler' exit }
ãªãã»ã©ãã¡ãã£ã¨éåæãè¦ããªãããªãã³ã¼ãã ããã©ãããã§ãããããã
ãã ãã ããã¨ãã£ã¦ä¸è¨âã®ãããªã³ã¼ãã§ãããã©ã«ãã®ã¢ã¯ã·ã§ã³ãã«ã²ã¨å³å ãããã¨ãã§ããããã¨ããã¨ãããã¯ã§ããªãã
system_handler = trap(:INT) { puts 'about to exit!' system_handler.call }
Ruby ã®ã³ã¼ãã§å¤æ°ã«æã¾ããããã·ã°ãã«ãã³ãã©ã¯ãããã¾ã§ Ruby ã³ã¼ãä¸ã§å®ç¾©ãããã·ã°ãã«ãã³ãã©ã ããã¨ãããã¨ãããã
以ä¸
ããã¾ã§è¦ã¦ããããã«ã対象ã«ãããããã»ã¹ã® pid 㨠kill
ã¨ãçµã¿åãããã°ãUnixã·ã¹ãã ä¸ã®ã©ããªããã»ã¹ã¨ãã·ã°ãã«ã§éä¿¡ãããã¨ãã§ãããããã»ã¹ã¯ãã¤ã§ãã·ã°ãã«ãåä¿¡ã§ããããã ã
æ¬æ¸ã§ã¯ã人éãã·ã°ãã«ãéãç¸æã¨ãã¦ä¸è¬çãªã®ã¯ãã£ã±ãããµã¼ãããã¼ã¢ã³ã¨ãã£ãé·æéåãç¶ããããã»ã¹ãå¤ãã¨ãã¦ããããããã«ã
ã·ã°ãã«ã使ã£ã¦ Unix ããã»ã¹ã¨ã®ã対話ããããªãã¡ããããªããªã£ãã¨ãã®ããã«ãèªåãæ±ããµã¼ãããã¼ã¢ã³ããã©ã®ã·ã°ãã«ãåããã¨ã©ãã¢ã¯ã·ã§ã³ããã®ããã¨ãããã¨ãç¥ã£ã¦ãããã¨ããã®ã¯å¤§äºããã ãªã¨æã£ãã
ä¾ãã° Unicorn ã§ããã° SIGNALS ã¨ãããã¡ã¤ã«ã«ããµãã¼ããã¦ããã·ã°ãã«ãã¨ãããã«å¯¾å¿ããå¦çãã®ãªã¹ãããããããããããè¦ãã°ãã·ã°ãã«ã使ã£ã¦ Unicorn ããã»ã¹ã¨ä¼è©±ãããã¨ãå¯è½ã«ãªãããã ã