
ãã®æ¬ã«ã¯ãUNIXããã³Linuxã«ãŒãã«ã®ç®¡çã«é¢ããæãéèŠã§å®çšçãªæ å ±ãå«ãŸããŠãããããäžçäžã®çå£ãªããã°ã©ããŒã«ãµãããã人æ°ããããŸãã ãã®ç¥èããªããã°ãå¹ççã§ä¿¡é Œæ§ã®é«ãã³ãŒããæžãããšã¯äžå¯èœã§ãã ãã¡ã€ã«ããã£ã¬ã¯ããªãããã³ããã»ã¹ã®åºæ¬ãããä¿¡å·åŠçãã¿ãŒããã«I / Oããã«ãã¹ã¬ããå®è¡ã¢ãã«ããœã±ããã䜿çšããããã»ã¹ééä¿¡ãªã©ãããè€éãªåé¡ã«åŸã ã«é²ã¿ãŸãã åèšã§ããã®æ¬ã¯POSIXéåæI / Oããµã€ã¯ãªãã¯ããã¯ãPOSIXããªã¢ãã»ããã©ãå«ã70以äžã®ã€ã³ã¿ãŒãã§ã€ã¹ãã«ããŒããŠããŸãã
å éšã§ã¯ãããŒã¢ã³ããã»ã¹ã®ç« ãèŠãŠãããŸãã
13.2ã æªéã®ç¹åŸŽ
ããã€ãã®æãäžè¬çãªã·ã¹ãã ããŒã¢ã³ãšã第9ç« ã§èª¬æãã端æ«ãšã»ãã·ã§ã³ãå¶åŸ¡ããããã»ã¹ã°ã«ãŒããšã®é¢ä¿ãèæ ®ããŠãã ãããpsïŒ1ïŒã³ãã³ãã¯ãã·ã¹ãã å ã®ããã»ã¹ã«é¢ããæ å ±ã衚瀺ããŸãã ãã®ã³ãã³ãã«ã¯å€ãã®ãã©ã¡ãŒã¿ãŒããããŸã;ãããã®è©³çŽ°ã«ã€ããŠã¯ããªãã¡ã¬ã³ã¹ã¬ã€ããåç §ããŠãã ããã ã³ãã³ããå®è¡ãã
ps -axj
BSDã·ã¹ãã ã§ã¯ãããã«è°è«ããéã«ãããããåãåã£ãæ å ±ã䜿çšããŸãã -aã¹ã€ããã¯ä»ã®ãŠãŒã¶ãŒãææããããã»ã¹ã衚瀺ããããã«äœ¿çšããã-xã¹ã€ããã¯å¶åŸ¡ç«¯æ«ãæããªãããã»ã¹ã衚瀺ããããã«äœ¿çšããã-jã¹ã€ããã¯ã¿ã¹ã¯ã«é¢é£ããè¿œå æ å ±ã衚瀺ããããã«äœ¿çšãããŸãïŒã»ãã·ã§ã³IDãããã»ã¹ã°ã«ãŒãIDãå¶åŸ¡ç«¯æ«ããã³ã端æ«ããã»ã¹ã°ã«ãŒãã®èå¥åã
System VããŒã¹ã®ã·ã¹ãã ã®å Žåãåæ§ã®ã³ãã³ãã¯ps -efjã®ããã«ãªããŸãã ïŒã»ãã¥ãªãã£äžã®çç±ãããUNIXã®äžéšã®ããŒãžã§ã³ã§ã¯ãpsã³ãã³ãã䜿çšããŠä»ã®ãŠãŒã¶ãŒãããã»ã¹ã衚瀺ããããšãèš±å¯ããŠããŸãããïŒpsã³ãã³ãã®åºåã¯æ¬¡ã®ããã«ãªããŸãã

ãã®äŸããã环ç©ããã»ããµæéãªã©ãç¹ã«é¢å¿ã®ãªãåãããã€ãåé€ããŸããã ããã«ã¯ãå·Šããå³ã«æ¬¡ã®åã衚瀺ãããŸãããŠãŒã¶ãŒèå¥åïŒUIDïŒãããã»ã¹èå¥åïŒPIDïŒã芪ããã»ã¹èå¥åïŒPPIDïŒãããã»ã¹ã°ã«ãŒãèå¥åïŒPGIDïŒãã»ãã·ã§ã³èå¥åïŒSIDïŒã端æ«åïŒTTYïŒããã³ã³ãã³ãã©ã€ã³ïŒCMD ïŒ
ãã®ã³ãã³ããå®è¡ãããã·ã¹ãã ïŒLinux 3.2.0ïŒã¯ãã»ãã·ã§ã³IDã®æŠå¿µããµããŒãããŠããŸããããã¯ãã»ã¯ã·ã§ã³9.5ã§setsidé¢æ°ã«ã€ããŠèª¬æãããšãã«èšåããŸããã ã»ãã·ã§ã³èå¥åã¯ãåã«ã»ãã·ã§ã³ã®ããã»ã¹ãªãŒããŒèå¥åã§ãã ãã ããBSDããŒã¹ã®ã·ã¹ãã ã§ã¯ãããã»ã¹ãå±ããããã»ã¹ã°ã«ãŒãã«å¯Ÿå¿ããã»ãã·ã§ã³æ§é ã®ã¢ãã¬ã¹ã衚瀺ãããŸãïŒã»ã¯ã·ã§ã³9.11ïŒã
衚瀺ãããã·ã¹ãã ããã»ã¹ã®ãªã¹ãã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®å®è£ ã«å€§ããäŸåããŸãã éåžžããããã¯èŠªããã»ã¹0ã®èå¥åãæã€ããã»ã¹ã§ãããããŒãããã»ã¹äžã«ã«ãŒãã«ã«ãã£ãŠèµ·åãããŸãã ïŒäŸå€ã¯ãã«ãŒãã«ãããŒãæã«å®è¡ãããŠãŒã¶ãŒã¬ãã«ã®ã³ãã³ãã§ãããããinitããã»ã¹ã§ããïŒã«ãŒãã«ããã»ã¹ã¯ãã·ã¹ãã ã®å®è¡äžã«åžžã«ååšããç¹å¥ãªããã»ã¹ã§ãã ãããã®ããã»ã¹ã«ã¯ã¹ãŒããŒãŠãŒã¶ãŒç¹æš©ããããå¶åŸ¡ç«¯æ«ãã³ãã³ãã©ã€ã³ããããŸããã
ãã®psã³ãã³ãåºåã®äŸã§ã¯ãè§æ¬åŒ§ã§å²ãŸããååã§ã«ãŒãã«ããŒã¢ã³ãèªèã§ããŸãã ã«ãŒãã«ããã»ã¹ãäœæããããã«ããã®ããŒãžã§ã³ã®Linuxã¯ç¹å¥ãªã«ãŒãã«ããã»ã¹ã§ããkthreaddã䜿çšãããããä»ã®ãã¹ãŠã®ã«ãŒãã«ããŒã¢ã³ã®èŠªã¯kthreaddããã»ã¹ã§ãã ããã»ã¹ã®ã³ã³ããã¹ãã§æäœãå®è¡ããå¿ èŠããããããŠãŒã¶ãŒããã»ã¹ããåŒã³åºãããŠããªãã«ãŒãã«ã³ã³ããŒãã³ãããšã«ãéåžžãã«ã¹ã¿ã ããã»ã¹ãäœæãããŸã-ã«ãŒãã«ããŒã¢ã³ã ããšãã°ãLinuxã®å ŽåïŒ
- ããŒãžãã³ãããŒã¢ã³ãšãåŒã°ããkswapdããŒã¢ã³ããããŸãã ä»®æ³ã¡ã¢ãªãµãã·ã¹ãã ã®ãµããŒããæäŸããæéã®çµéãšãšãã«ãå€æŽãããã¡ã¢ãªããŒãžããã£ã¹ã¯ã«æžã蟌ã¿ããããã解æŸã§ããããã«ããŸãã
- ãã©ãã·ã¥ããŒã¢ã³ã¯ã䜿çšå¯èœãªã¡ã¢ãªã®éãèšå®ãããæå°å¶éãŸã§äœäžãããšãå€æŽãããããŒãžããã£ã¹ã¯ã«ããã·ã¥ããŸãã ãŸããã¡ã¢ãªã®å€æŽãããããŒãžãå®æçã«ãã£ã¹ã¯ã«ããã·ã¥ããŠãã·ã¹ãã ãã¯ã©ãã·ã¥ããå Žåã®ããŒã¿æ倱ãæžãããŸãã ã·ã¹ãã ã¯ãè€æ°ã®ãã©ãã·ã¥ããŒã¢ã³ïŒããã€ã¹ããšã«1ã€ïŒãåæã«å®è¡ã§ããŸãã äžèšã®äŸã§ã¯ãflush-8ãšããååã®ãã©ãã·ã¥ããŒã¢ã³ã1ã€ã ããããŸãã0ã¯ã8ãã¡ãžã£ãŒããã€ã¹çªå·ã§ã0ããã€ããŒã§ãã
- sync_supersããŒã¢ã³ã¯ããã¡ã€ã«ã·ã¹ãã ã®ã¡ã¿ããŒã¿ãå®æçã«ãã£ã¹ã¯ã«ãããããŸãã
- jbdããŒã¢ã³ã¯ãext4ãã¡ã€ã«ã·ã¹ãã ã§ãã°ããµããŒãããŸãã
ã»ã¯ã·ã§ã³8.2ã§èª¬æããããã«ãéåžžãèå¥å1ã®ããã»ã¹ã¯initããã»ã¹ïŒMac OS Xã§èµ·åïŒã§ãã ããã¯ããšããããããŸããŸãªããŒãã¬ãã«ã§ããŸããŸãªã·ã¹ãã ãµãŒãã¹ãéå§ããã·ã¹ãã ããŒã¢ã³ã§ãã éåžžããããã®ãµãŒãã¹ã¯ããŒã¢ã³ãšããŠãå®è£ ãããŸãã
rpcbindããŒã¢ã³ã¯ãRPCïŒãªã¢ãŒãããã·ãŒãžã£ã³ãŒã«ïŒãµãŒãã¹ã®æ°å€èå¥åããããã¯ãŒã¯ããŒãçªå·ã«å€æããŸãã rsyslogdããŒã¢ã³ã¯ã管çè ã確èªã§ããã¡ãã»ãŒãžãã·ã¹ãã ãã°ã«åºåããããã«ããã°ã©ã ã§äœ¿çšã§ããŸãã ã¡ãã»ãŒãžã¯ã³ã³ãœãŒã«ã«è¡šç€ºã§ããã ãã§ãªãããã¡ã€ã«ã«æžã蟌ãããšãã§ããŸãã ïŒsyslogdãã®ã³ã°ã¡ã«ããºã ã«ã€ããŠã¯ã13.4ç¯ã§è©³ãã説æããŸããïŒ
ã»ã¯ã·ã§ã³9.3ã§ã¯ãinetdããŒã¢ã³ã«ã€ããŠæ¢ã«èª¬æããŸããã ãã®ããŒã¢ã³ã¯ãããŸããŸãªãããã¯ãŒã¯ãµãŒããŒããã®èŠæ±ããããã¯ãŒã¯ããå°çããããšãæ³å®ããŠããŸãã ããŒã¢ã³nfsdãnfsiodãlockdãrpciodãrpc.idmapdãrpc.statdãrpc.mountdã¯ãNetwork File SystemïŒNFSïŒã®ãµããŒããæäŸããŸãã ãããã®æåã®4ã€ã¯ã«ãŒãã«ããŒã¢ã³ã§ãããæåŸã®3ã€ã¯ãŠãŒã¶ãŒã¬ãã«ã®ããŒã¢ã³ã§ããããšã«æ³šæããŠãã ããã
cronããŒã¢ã³ã¯å®æçã«ã³ãã³ããå®è¡ããŸãã ããŸããŸãªã·ã¹ãã 管çã¿ã¹ã¯ãåŠçããæå®ãããééã§éå§ããŸãã atdããŒã¢ã³ã¯cronããŒã¢ã³ã«äŒŒãŠããããŠãŒã¶ãŒã¯ç¹å®ã®æéã«ã¿ã¹ã¯ãå®è¡ã§ããŸãããã¿ã¹ã¯ã¯1åå®è¡ãããŸãã cupsdããŒã¢ã³ã¯ããªã³ããµãŒããŒã§ãããããªã³ã¿ãŒãªã¯ãšã¹ããåŠçããŸãã sshdããŒã¢ã³ã¯ãã·ã¹ãã ãžã®ãªã¢ãŒãã¢ã¯ã»ã¹ãæäŸããã»ãã¥ã¢ã¢ãŒãã§å®è¡ããŸãã
ã»ãšãã©ã®ããŒã¢ã³ã«ã¯ã«ãŒãæš©éãããããšã«æ³šæããŠãã ããã ããŒã¢ã³ã«ã¯å¶åŸ¡ç«¯æ«ããããŸããã端æ«åã®ä»£ããã«çå笊ããããŸãã ã«ãŒãã«ããŒã¢ã³ã¯ãå¶åŸ¡ç«¯æ«ãªãã§èµ·åããŸãã ãŠãŒã¶ãŒã¬ãã«ã®ããŒã¢ã³çšã®å¶åŸ¡ç«¯æ«ããªãã®ã¯ãããããsetsidé¢æ°ãåŒã³åºããçµæã§ãã ãã¹ãŠã®ãŠãŒã¶ãŒã¬ãã«ã®ããŒã¢ã³ã¯ãã°ã«ãŒããªãŒããŒããã³ã»ãã·ã§ã³ãªãŒããŒã§ãããããã»ã¹ã°ã«ãŒãããã³ã»ãã·ã§ã³å ã®å¯äžã®ããã»ã¹ã§ãïŒäŸå€ã¯rsyslogdã§ãïŒã æåŸã«ãã»ãšãã©ã®ããŒã¢ã³ã®èŠªã¯initããã»ã¹ã§ããããšã«æ³šæããŠãã ããã
13.3ã æªéã®ããã°ã©ãã³ã°ã«ãŒã«
æãŸãããªãçžäºäœçšãé¿ããããã«ãããŒã¢ã³ãããã°ã©ãã³ã°ããéã«ã¯ç¹å®ã®ã«ãŒã«ã«åŸãå¿ èŠããããŸãã ãããã®ã«ãŒã«ãæåã«ãªã¹ããã次ã«ããããå®è£ ããããŒã¢ã³åæ©èœã瀺ããŸãã
1. umaské¢æ°ãåŒã³åºããŠããã¡ã€ã«äœæã¢ãŒããã¹ã¯ã0ã«ãªã»ããããŸããéå§ããã»ã¹ããç¶æ¿ãããã¹ã¯ã¯ãäžéšã®ã¢ã¯ã»ã¹ãããããã¹ã¯ããå ŽåããããŸãã ããŒã¢ã³ããã»ã¹ããã¡ã€ã«ãäœæãããšæ³å®ãããå Žåãç¹å®ã®èš±å¯ããããèšå®ããå¿ èŠããããŸãã ããšãã°ãããŒã¢ã³ãã°ã«ãŒãã®èªã¿åãããã³æžã蟌ã¿æš©éã§ãã¡ã€ã«ãäœæããå Žåããããã®ãããã®ããããããªãã«ãããã¡ã€ã«äœæã¢ãŒããã¹ã¯ã¯ãããé²ããŸãã äžæ¹ãããŒã¢ã³ããã¡ã€ã«ãäœæããã©ã€ãã©ãªé¢æ°ãåŒã³åºãå Žåãã©ã€ãã©ãªé¢æ°ã¯èš±å¯ãããä»ãã®åŒæ°ãåãå ¥ããªãå¯èœæ§ããããããããå¶éçãªãã¹ã¯ïŒããšãã°ã007ïŒãèšå®ããããšã¯çã«ããªã£ãŠããŸãã
2. forké¢æ°ãåŒã³åºããŠã芪ããã»ã¹ãçµäºããŸãã ãªããããè¡ãããã®ã§ããïŒ ãŸããããŒã¢ã³ãéåžžã®ã·ã§ã«ã³ãã³ããšããŠéå§ããã芪ããã»ã¹ãçµäºãããšãã³ãã³ããå®äºãããšã·ã§ã«ã«èªèãããŸãã 次ã«ãåããã»ã¹ã¯èŠªããããã»ã¹ã°ã«ãŒãèå¥åãç¶æ¿ããŸããããã®ããã»ã¹èå¥åãåãåããŸãã ããã«ãããåããã»ã¹ãã°ã«ãŒãã®ãªãŒããŒã«ãªããªãããšãä¿èšŒãããŸããããã¯ãåŸã§å®è¡ãããsetsidé¢æ°ãåŒã³åºãããã«å¿ èŠãªæ¡ä»¶ã§ãã
3. setsidé¢æ°ã«ã¢ã¯ã»ã¹ããŠãæ°ããã»ãã·ã§ã³ãäœæããŸãã åæã«ïŒã»ã¯ã·ã§ã³9.5ãæãåºããŠãã ããïŒãããã»ã¹ã¯ïŒaïŒæ°ããã»ãã·ã§ã³ã®ãªãŒããŒãïŒbïŒæ°ããããã»ã¹ã°ã«ãŒãã®ãªãŒããŒãïŒcïŒå¶åŸ¡ç«¯æ«ã倱ããŸãã
System VããŒã¹ã®ã·ã¹ãã ã§ã¯ããã®æç¹ã§forké¢æ°ãå床åŒã³åºãã2çªç®ã®åãããŒã¢ã³ãšããŠç¶ç¶ããããã«èŠªããã»ã¹ãçµäºããããšããå§ãããŸãã ãã®ææ³ã¯ãããŒã¢ã³ãã»ãã·ã§ã³ãªãŒããŒã«ãªããªãããã«ããããã«ããå¶åŸ¡ç«¯æ«ãSystem Vã§åä¿¡ãããã®ãé²ããŸãïŒã»ã¯ã·ã§ã³9.6ïŒã ãŸãã¯ãå¶åŸ¡ç«¯æ«ãååŸããªãããã«ããã«ã¯ã端æ«ããã€ã¹ãéããšãã«O_NOCTTYãã©ã°ãæå®ããå¿ èŠããããŸãã
4.ã«ãŒããã£ã¬ã¯ããªãçŸåšã®äœæ¥ãã£ã¬ã¯ããªã«ããŸãã 芪ããã»ã¹ããç¶æ¿ãããçŸåšã®äœæ¥ãã£ã¬ã¯ããªã¯ãããŠã³ãããããã¡ã€ã«ã·ã¹ãã ã«ããå ŽåããããŸãã ããŒã¢ã³ã¯ãååãšããŠãã·ã¹ãã ãåèµ·åãããŸã§åžžã«ååšãããããåæ§ã®ç¶æ³ã§ãããŒã¢ã³ã®äœæ¥ãã£ã¬ã¯ããªãããŠã³ãããããã¡ã€ã«ã·ã¹ãã ã«ããå Žåãã¢ã³ããŠã³ãã§ããŸããã ãŸãã¯ãäžéšã®ããŒã¢ã³ã¯ç¬èªã®çŸåšã®äœæ¥ãã£ã¬ã¯ããªãèšå®ããå¿ èŠãªãã¹ãŠã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸãã ããšãã°ãå°å·ããŒã¢ã³ã¯ãå€ãã®å Žåãå°å·ãžã§ãã眮ãããŠãããããã¡ãŒãã£ã¬ã¯ããªãçŸåšã®äœæ¥ãã£ã¬ã¯ããªãšããŠéžæããŸãã
5.äžèŠãªãã¡ã€ã«èšè¿°åããã¹ãŠéããŸãã ããã«ããã芪ããã»ã¹ïŒã·ã§ã«ãŸãã¯ä»ã®ããã»ã¹ïŒããç¶æ¿ãããäžéšã®èšè¿°åãéãããŸãŸã«ãªãã®ãé²ããŸãã open_maxé¢æ°ïŒãªã¹ã2.4ïŒãŸãã¯getrlimité¢æ°ïŒã»ã¯ã·ã§ã³7.11ïŒã䜿çšããŠãæ倧èšè¿°åçªå·ã決å®ãããã®çªå·ãŸã§ã®ãã¹ãŠã®èšè¿°åãéããããšãã§ããŸãã
6.ããã€ãã®ããŒã¢ã³ã¯ãããã€ã¹/ dev / nullã§çªå·0ã1ã2ã®ãã¡ã€ã«èšè¿°åãéããŸãããããã£ãŠãæšæºå ¥åããã€ã¹ããã®èªã¿åããæšæºåºåããã€ã¹ãžã®æžã蟌ã¿ããšã©ãŒã¡ãã»ãŒãžãè©Šã¿ãã©ã€ãã©ãªé¢æ°ã¯ã¬ã³ããªã³ã°ãããŸããã圱é¿ãªãã ããŒã¢ã³ã¯ã©ã®ç«¯æ«ããã€ã¹ã«ãæ¥ç¶ãããŠããªãããããŠãŒã¶ãŒãšå¯Ÿè©±çã«å¯Ÿè©±ããããšã¯ã§ããŸããã ããŒã¢ã³ã察話åã»ãã·ã§ã³ã§éå§ãããå Žåã§ããããã¯ã°ã©ãŠã³ãã«ãªããããŒã¢ã³ããã»ã¹ã«åœ±é¿ãäžããããšãªãåæã»ãã·ã§ã³ãçµäºã§ããŸãã ä»ã®ãŠãŒã¶ãŒã¯åã端æ«ããã·ã¹ãã ã«ãã°ã€ã³ã§ããŸããããŒã¢ã³ã¯ç«¯æ«ã«æ å ±ãåºåããŸããããŸãããŠãŒã¶ãŒã¯ç«¯æ«ããã®å ¥åãããŒã¢ã³ã«ãã£ãŠèªã¿åãããããšãæåŸ ããŸããã
äŸ
ãªã¹ã13.1ã¯ãããŒã¢ã³ã«ãªãããã¢ããªã±ãŒã·ã§ã³ãåŒã³åºãããšãã§ããé¢æ°ã瀺ããŠããŸãã
ãªã¹ã13.1 ããŒã¢ã³ããã»ã¹ã®åæå
#include "apue.h" #include <syslog.h> #include <fcntl.h> #include <sys/resource.h> void daemonize(const char *cmd) { int i, fd0, fd1, fd2; pid_t pid; struct rlimit rl; struct sigaction sa; /* * . */ umask(0); /* * . */ if (getrlimit(RLIMIT_NOFILE, &rl) < 0) err_quit("%s: ", cmd); /* * , . */ if ((pid = fork()) < 0) err_quit("%s: fork", cmd); else if (pid != 0) /* */ exit(0); setsid(); /* * . */ sa.sa_handler = SIG_IGN; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGHUP, &sa, NULL) < 0) err_quit("%s: SIGHUP", cmd); if ((pid = fork()) < 0) err_quit("%s: fork", cmd); else if (pid != 0) /* */ exit(0); /* * , * . */ if (chdir("/") < 0) err_quit("%s: /", cmd); /* * . */ if (rl.rlim_max == RLIM_INFINITY) rl.rlim_max = 1024; for (i = 0; i < rl.rlim_max; i++) close(i); /* * 0, 1 2 /dev/null. */ fd0 = open("/dev/null", O_RDWR); fd1 = dup(0); fd2 = dup(0); /* * . */ openlog(cmd, LOG_CONS, LOG_DAEMON); if (fd0 != 0 || fd1 != 1 || fd2 != 2) { syslog(LOG_ERR, " %d %d %d", fd0, fd1, fd2); exit(1); } }
daemonizeé¢æ°ãäžæåæ¢ããããã°ã©ã ããåŒã³åºãããå Žåãpsã³ãã³ãã䜿çšããŠããŒã¢ã³ã®ç¶æ ã確èªã§ããŸãã
$ ./a.out $ ps -efj UID PID PPID PGID SID TTY CMD sar 13800 1 13799 13799 ? ./a.out $ ps -efj | grep 13799 sar 13800 1 13799 13799 ? ./a.out
psã³ãã³ãã䜿çšãããšãã·ã¹ãã ã«èå¥å13799ã®ã¢ã¯ãã£ããªããã»ã¹ããªãããšã確èªã§ããŸããããã¯ãããŒã¢ã³ãããã»ã¹ã®å€ç«ã°ã«ãŒãïŒã»ã¯ã·ã§ã³9.10ïŒã«å±ããã»ãã·ã§ã³ãªãŒããŒã§ã¯ãªããããå¶åŸ¡ç«¯æ«ãååŸã§ããªãããšãæå³ããŸãã ããã¯ãdaemonizeé¢æ°ã®forké¢æ°ãžã®2åç®ã®åŒã³åºãã®çµæã§ãã ã芧ã®ãšãããããŒã¢ã³ã¯æ£ââããåæåãããŠããŸãã
13.4ã ãšã©ãŒãã°
ããŒã¢ã³ã«åºæã®åé¡ã®1ã€ã¯ããšã©ãŒã¡ãã»ãŒãžã®ã¡ã³ããã³ã¹ã§ãã ããŒã¢ã³ã¯ãå¶åŸ¡ç«¯æ«ãæããªããããæšæºãšã©ãŒã¡ãã»ãŒãžåºåããã€ã¹ã«åçŽã«ã¡ãã»ãŒãžãåºåããããšã¯ã§ããŸããã ã»ãšãã©ã®ã¯ãŒã¯ã¹ããŒã·ã§ã³ã§ã¯ãã«ããŠã£ã³ããŠã·ã¹ãã ãã³ã³ãœãŒã«ã§èµ·åããããããããŒã¢ã³ãã³ã³ãœãŒã«ã«ã¡ãã»ãŒãžãåºåããããšãèŠæ±ããããšã¯ã§ããŸããã ãŸããããŒã¢ã³ã«ã¡ãã»ãŒãžãå¥ã®ãã¡ã€ã«ã«ä¿åããããèŠæ±ããããšãã§ããŸããã ããã¯ãã·ã¹ãã 管çè ã«ãšã£ãŠçµ¶ãéãªãé çã®çš®ãšãªããåããŒã¢ã³ãã©ã®ãã¡ã€ã«ã«ã¡ãã»ãŒãžãæžã蟌ãããèŠããããåŸãªããªããŸãã ãšã©ãŒã¡ãã»ãŒãžãå ±åããããã®éäžåãããã¡ã«ããºã ãå¿ èŠã§ãã
BSDã·ã¹ãã ã®syslogã¡ã«ããºã ã¯ããŒã¯ã¬ãŒã§éçºããã4.2BSD以æ¥åºãæ®åããŠããŸãã ã»ãšãã©ã®BSD掟çã·ã¹ãã ã¯syslogããµããŒãããŠããŸãã SVR4ã®ç»å Žä»¥åã¯ãSystem Vã«ã¯ãšã©ãŒã¡ãã»ãŒãžãå ±åããããã®éäžã¡ã«ããºã ããããŸããã§ããã syslogé¢æ°ã¯ãXSIæ¡åŒµãšããŠSingle UNIX Specificationæšæºã«å«ãŸããŠããŸããã
BSDã·ã¹ãã ã®syslogã¡ã«ããºã ã¯ã4.2BSD以éåºã䜿çšãããŠããŸãã ã»ãšãã©ã®æªéã¯ãã®ç¹å®ã®ã¡ã«ããºã ã䜿çšããŸãã å³ 13.1ã«ãã®æ§é ã瀺ããŸãã ã¡ãã»ãŒãžãç»é²ããã«ã¯3ã€ã®æ¹æ³ããããŸãã
1.ã«ãŒãã«ããã·ãŒãžã£ã¯ããã°æ©èœã«ã¢ã¯ã»ã¹ã§ããŸãã ãããã®ã¡ãã»ãŒãžã¯ã/ dev / klogããã€ã¹ãéããŠèªã¿åãããšãã§ãããã¹ãŠã®ãŠãŒã¶ãŒããã»ã¹ã§å©çšã§ããŸãã ã«ãŒãã«ããã·ãŒãžã£ãèšè¿°ããªãããããã®é¢æ°ã¯èæ ®ããŸããã
2.ã¡ãã»ãŒãžãèšé²ããã»ãšãã©ã®ãŠãŒã¶ãŒããã»ã¹ïŒããŒã¢ã³ïŒã¯ãsyslogïŒ3ïŒé¢æ°ãåŒã³åºããŸãã åŸã§äœæ¥ããæé ãæ€èšããŸãã ãã®é¢æ°ã¯ãUNIXãã¡ã€ã³ãœã±ãã-/ dev / logãä»ããŠã¡ãã»ãŒãžãéä¿¡ããŸãã
3.ãã®ã³ã³ãã¥ãŒã¿ãŒãŸãã¯TCP / IPãããã¯ãŒã¯ã§ãã®ã³ã³ãã¥ãŒã¿ãŒã«æ¥ç¶ãããŠããå¥ã®ã³ã³ãã¥ãŒã¿ãŒã§å®è¡ãããŠãããŠãŒã¶ãŒããã»ã¹ã¯ãããŒã514ã«UDPã¡ãã»ãŒãžãéä¿¡ã§ããŸããsyslogé¢æ°ã¯UDPããŒã¿ã°ã©ã ãçæããªãããšã«æ³šæããŠãã ãããããã°ã©ã ã¯ãããã¯ãŒã¯ã®çžäºäœçšããµããŒãããŠããŸããã

UNIXãã¡ã€ã³ãœã±ããã®è©³çŽ°ã«ã€ããŠã¯ã[StevensãFennerãand Rudoffã2004]ãåç §ããŠãã ããã éåžžãsyslogdããŒã¢ã³ã¯ãã¡ãã»ãŒãžãèšé²ãã3ã€ã®æ¹æ³ãã¹ãŠãç解ããŸãã èµ·åæã«ããã®ããŒã¢ã³ã¯æ§æãã¡ã€ã«ïŒéåžžã¯/etc/syslog.confïŒãèªã¿åããããŸããŸãªã¯ã©ã¹ã®ã¡ãã»ãŒãžã®éä¿¡å ã決å®ããŸãã ããšãã°ãã·ã¹ãã 管çè ã®ã³ã³ãœãŒã«ïŒã·ã¹ãã äžã«ããå ŽåïŒã«ç·æ¥ã¡ãã»ãŒãžã衚瀺ããèŠåããã¡ã€ã«ã«æžã蟌ãããšãã§ããŸãã
ç§ãã¡ã®å Žåããã®ã¡ã«ããºã ãšã®çžäºäœçšã¯syslogé¢æ°ãä»ããŠå®è¡ãããŸãã
#include <syslog.h> void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, ...); void closelog(void); int setlogmask(int maskpri);
ãã®ã³ã°ãã©ã€ãªãªãã£ãã¹ã¯ã®ä»¥åã®å€ãè¿ããŸã
openlogé¢æ°ã¯çç¥ã§ããŸãã syslogé¢æ°ã®æåã®åŒã³åºãã®åã«openlogé¢æ°ãåŒã³åºãããªãã£ãå Žåã¯ãèªåçã«åŒã³åºãããŸãã closelogé¢æ°ã®åŒã³åºãããªãã·ã§ã³ã§ããsyslogdããŒã¢ã³ãšã®å¯Ÿè©±ã«äœ¿çšããããã¡ã€ã«èšè¿°åãéããã ãã§ãã
openlogé¢æ°ã䜿çšãããšãidentåŒæ°ã«èå¥æååãæå®ã§ããŸããèå¥æååã«ã¯ãéåžžãããã°ã©ã ã®ååïŒããšãã°ãcronãŸãã¯inetdïŒãå«ãŸããŸãã ãªãã·ã§ã³åŒæ°ã¯ãã¡ãã»ãŒãžã衚瀺ããããŸããŸãªæ¹æ³ãå®çŸ©ããããããã¹ã¯ã§ãã è¡šã®äžã ãã¹ã¯ã«å«ããããšãã§ããå€ã¯13.1ã§ãã XSIåã¯ãSingle UNIX Specificationæšæºãopenlogé¢æ°ã®å®çŸ©ã«å«ãããã®ã瀺ããŠããŸãã
ãã¡ã·ãªãã£åŒæ°ã®å¯èœãªå€ã¯è¡šã«èšèŒãããŠããŸãã 13.2ã Single UNIX Specificationæšæºã§ã¯ãç¹å®ã®ã·ã¹ãã ã§äžè¬çã«å©çšå¯èœãªå€ã®äžéšã®ã¿ãå®çŸ©ãããŠããããšã«æ³šæããŠãã ããã facilityåŒæ°ã䜿çšãããšãããŸããŸãªãœãŒã¹ããã®ã¡ãã»ãŒãžãåŠçããæ¹æ³ã決å®ã§ããŸãã ããã°ã©ã ãopenlogé¢æ°ãåŒã³åºããªããããã¡ã·ãªãã£åŒæ°ã§å€0ãæž¡ãå Žåãsyslogé¢æ°ã䜿çšããŠã¡ãã»ãŒãžãœãŒã¹ãæå®ãããããåªå 床åŒæ°ã®äžéšãšããŠå®çŸ©ã§ããŸãã
syslogé¢æ°ã¯ãã¡ãã»ãŒãžãéä¿¡ããããã«åŒã³åºãããŸãã åªå 床åŒæ°ã¯ããã¡ã·ãªãã£åŒæ°ã®å€ïŒè¡š13.2ïŒãšã¡ãã»ãŒãžã®é倧床ã¬ãã«ïŒè¡š13.3ïŒã®çµã¿åããã§ãã éèŠåºŠã¬ãã«ã¯è¡šã«ãªã¹ããããŠããŸãã 13.3éé ãæé«ããæäœãŸã§ã
è¡š13.1 openlogé¢æ°ã®ãªãã·ã§ã³åŒæ°ã«å«ãŸããå¯èœæ§ã®ããå€

formatåŒæ°ãšããã«ç¶ããã¹ãŠã®åŒæ°ã¯ãã¡ãã»ãŒãžæååãäœæããããã«vsprintfé¢æ°ã«æž¡ãããŸãã ãã©ãŒãããæååã®ïŒ mæåã¯ãerrnoå€æ°ã®å€ãšäžèŽãããšã©ãŒã¡ãã»ãŒãžïŒstrerrorïŒã«çœ®ãæããããŸãã
setlogmaské¢æ°ã䜿çšããŠãããã»ã¹ã¡ãã»ãŒãžã®åªå 床ãã¹ã¯ãèšå®ã§ããŸãã ãã®é¢æ°ã¯ãåã®ãã¹ã¯å€ãè¿ããŸãã åªå 床ãã¹ã¯ãèšå®ãããŠããå Žåãåªå 床ã¬ãã«ããã¹ã¯ã«å«ãŸããŠããªãã¡ãã»ãŒãžã¯ãã°ã«èšé²ãããŸããã 泚ïŒäžèšããããã¹ã¯ã0ã«èšå®ãããŠããå Žåããã¹ãŠã®ã¡ãã»ãŒãžããã°ã«èšé²ãããããšã«ãªããŸãã
å€ãã®ã·ã¹ãã ã«ã¯ãsyslogãšã³ãžã³ã«ã¡ãã»ãŒãžãéä¿¡ã§ãããã¬ãŒïŒ1ïŒããããŸãã äžéšã®å®è£ ã§ã¯ãã¡ãã»ãŒãžãœãŒã¹ïŒãã¡ã·ãªãã£ïŒãé倧床ã¬ãã«ãããã³èå¥åæååãæå®ãããªãã·ã§ã³ã®åŒæ°ãããã°ã©ã ã«æž¡ãããšãã§ããŸãããSystem UNIX Specificationæšæºã§ã¯è¿œå ã®åŒæ°ã¯æå®ãããŠããŸããã loggerã³ãã³ãã¯ãé察話åã¢ãŒãã§å®è¡ãããã¡ãã»ãŒãžãã®ã³ã°ã¡ã«ããºã ãå¿ èŠãšããã·ã§ã«ã¹ã¯ãªããã§äœ¿çšããããã®ãã®ã§ãã
è¡š13.2ã openlogé¢æ°ã®æ©èœåŒæ°ã®å¯èœãªå€


è¡š13.3ã ã¡ãã»ãŒãžã®é倧床ã¬ãã«ïŒéé ïŒ

äŸ
ïŒä»®æ³ïŒå°å·ããŒã¢ã³ã§ã¯ã次ã®è¡ã確èªã§ããŸãã
openlog("lpd", LOG_PID, LOG_LPR); syslog(LOG_ERR, "open error for %s: %m", filename);
openlogé¢æ°ã®åŒã³åºãã¯ãããã°ã©ã ã®ååã§èå¥è¡ãèšå®ããããã»ã¹èå¥åãã¡ãã»ãŒãžã«è¿œå ããå¿ èŠãããããšã瀺ããå°å·ã·ã¹ãã ããŒã¢ã³ãã¡ãã»ãŒãžãœãŒã¹ã«ãªãããšãèŠå®ããŠããŸããsyslogé¢æ°åŒã³åºãã¯ãã¡ãã»ãŒãžã®é倧床ã¬ãã«ãšã¡ãã»ãŒãžèªäœã瀺ããŸããopenlogé¢æ°åŒã³åºããçç¥ãããšãsyslogåŒã³åºãã¯æ¬¡ã®ããã«ãªããŸãã
syslog(LOG_ERR | LOG_LPR, "open error for %s: %m", filename);
ããã§ã¯ãpriorityåŒæ°ã§ãã¡ãã»ãŒãžãœãŒã¹ãžã®ãªã³ã¯ãšã¡ãã»ãŒãžã®é倧床ã¬ãã«ãçµã¿åãããŸããã
syslogé¢æ°ã«å ããŠãå€ãã®ãã©ãããã©ãŒã ã¯ãã®ããªã¢ã³ãããµããŒãããŠãããå¯å€é·ãªã¹ãã®åœ¢åŒã§è¿œå ã®åŒæ°ãåãå ¥ããŸãã
#include <syslog.h> #include <stdarg.h> void vsyslog(int priority, const char *format, va_list arg);
æ¬æžã§èª¬æãã4ã€ã®ãã©ãããã©ãŒã ã¯ãã¹ãŠvsyslogæ©èœããµããŒãããŠããŸãããSingle UNIX Specificationæšæºã®äžéšã§ã¯ãããŸããã泚ïŒãã®æ©èœãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããããã«ããã«ã¯ãFreeBSDã®__BSD_VISIBLEãLinuxã®__USE_BSDãªã©ãè¿œå ã®æåãå®çŸ©ããå¿ èŠãããå ŽåããããŸãã
ã»ãšãã©ã®syslogdå®è£ ã¯ãã¢ããªã±ãŒã·ã§ã³ã®åŠçæéãççž®ããããã«ãã¥ãŒã«å ¥ããããã¡ãã»ãŒãžãå ¥ããŸãããã®æç¹ã§ããŒã¢ã³ã2ã€ã®åäžã®ã¡ãã»ãŒãžãåä¿¡ããå Žåã1ã€ã ãããã°ã«æžã蟌ãŸããŸãããã ãããã®ãããªã¡ãã»ãŒãžã®æåŸã«ãããŒã¢ã³ã¯æ¬¡ã®å 容ã®è¡ãè¿œå ããŸãïŒãæåŸã®ã¡ãã»ãŒãžãNåç¹°ãè¿ãããŸãããïŒæåŸã®ã¡ãã»ãŒãžãNåç¹°ãè¿ãããŸããïŒã
13.5ãåäžã³ããŒã®æªé
ããã€ãã®ããŒã¢ã³ã¯ãèªåèªèº«ã®1ã€ã®ã³ããŒã®ã¿ãåæã«æ©èœããããã«å®è£ ãããŠããŸãããã®åäœã®çç±ã¯ãããšãã°ããªãœãŒã¹ã®æä»çæææš©ã®èŠä»¶ã§ããå¯èœæ§ããããŸãããã®ãããcronããŒã¢ã³ããã®ã³ããŒã®ããã€ããåæã«æ©èœãããå Žåããããããã¹ã±ãžã¥ãŒã«ãããæéã«éããåŸã«åãæäœãéå§ããããšããããããããããšã©ãŒã«ãªããŸãã
ããŒã¢ã³ãããã€ã¹ãžã®ã¢ã¯ã»ã¹ãå¿ èŠãšããå Žåãããã€ã¹ãã©ã€ããŒã¯ããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããŠãããã€ã¹ãããã€ãã®ããã°ã©ã ã«ãã£ãŠããã°ã©ã ãéãã®ãé²ããŸããããã«ãããåæããŒã¢ã³ã€ã³ã¹ã¿ã³ã¹ã®æ°ã1ã€ã«å¶éãããŸãããã ããããŒã¢ã³ããã®ãããªããã€ã¹ã«ã¢ã¯ã»ã¹ããã€ããããªãå Žåã¯ãå¶éã課ãããã«å¿ èŠãªãã¹ãŠã®äœæ¥ãå®è¡ããå¿ èŠããããŸãã
ããŒã¢ã³ã®åæã³ããŒæ°ãå¶éããäž»ãªã¡ã«ããºã ã®1ã€ã¯ããã¡ã€ã«ãšã¬ã³ãŒãã®ããã¯ã§ãã ïŒã»ã¯ã·ã§ã³14.3ã§ãã¡ã€ã«ãšãã¡ã€ã«ã®ã¬ã³ãŒãããããã¯ããããšãæ€èšããŸããïŒåããŒã¢ã³ããã¡ã€ã«ãäœæãããã®ãã¡ã€ã«ã«æžã蟌ã¿ããã¯ãèšå®ããããšãããšãã·ã¹ãã ã¯ãã®ãããªããã¯ã1ã€ã ãèš±å¯ããŸããæžã蟌ã¿ããã¯ãèšå®ãã以éã®ãã¹ãŠã®è©Šè¡ã¯å€±æããããŒã¢ã³ãæ¢ã«å®è¡äžã§ããããšãããŒã¢ã³ã®æ®ãã«äŒããŸãã
ãã¡ã€ã«ãšã¬ã³ãŒãã®ããã¯ã¯ãçžäºæé€ã®ããã®äŸ¿å©ãªã¡ã«ããºã ã§ããããŒã¢ã³ããã¡ã€ã«å šäœã«ããã¯ãèšå®ãããšãããŒã¢ã³ã®å®äºæã«èªåçã«è§£æŸãããŸããããã«ããã以åã®ããŒã¢ã³ã®ã³ããŒããæ®ã£ãŠããããã¯ãåé€ããå¿ èŠããªããªãããããšã©ãŒå埩ããã»ã¹ãç°¡åã«ãªããŸãã
äŸ
ãªã¹ã13.2ã®é¢æ°ã¯ããã¡ã€ã«ããã¯ãšã¬ã³ãŒãããã¯ã䜿çšããŠãããŒã¢ã³ã®åäžã€ã³ã¹ã¿ã³ã¹ã確å®ã«éå§ãããããã«ããæ¹æ³ã瀺ããŠããŸãã
ãªã¹ã13.2ãããŒã¢ã³ã®1ã€ã®ã³ããŒã®ã¿ãèµ·åãããããšãä¿èšŒããæ©èœ
#include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <syslog.h> #include <string.h> #include <errno.h> #include <stdio.h> #include <sys/stat.h> #define LOCKFILE "/var/run/daemon.pid" #define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) extern int lockfile(int); int already_running(void) { int fd; char buf[16]; fd = open(LOCKFILE, O_RDWR|O_CREAT, LOCKMODE); if (fd < 0) { syslog(LOG_ERR, " %s: %s", LOCKFILE, strerror(errno)); exit(1); } if (lockfile(fd) < 0) { if (errno == EACCES || errno == EAGAIN) { close(fd); return(1); } syslog(LOG_ERR, " %s: %s", LOCKFILE, strerror(errno)); exit(1); } ftruncate(fd, 0); sprintf(buf, "%ld", (long)getpid()); write(fd, buf, strlen(buf)+1); return(0); }
ããŒã¢ã³ã®åã³ããŒã¯ããã¡ã€ã«ãäœæãããã®ããã»ã¹èå¥åãæžã蟌ã¿ãŸããããã¯ãã·ã¹ãã 管çè ãããã»ã¹ãèå¥ããã®ã«åœ¹ç«ã¡ãŸãããã¡ã€ã«ããã§ã«ããã¯ãããŠããå Žåãlockfileé¢æ°ã¯errnoå€æ°ã«ãšã©ãŒã³ãŒãEACCESSãŸãã¯EAGAINã§å€±æããåŒã³åºãããã°ã©ã ã«å€1ãè¿ããããŒã¢ã³ãæ¢ã«å®è¡ãããŠããããšã瀺ããŸãããã以å€ã®å Žåãé¢æ°ã¯ãã¡ã€ã«ãµã€ãºããŒãã«åãæšãŠãããã»ã¹èå¥åãæžã蟌ã¿ã0ãè¿ããŸãã
æååãšããŠè¡šãããããŒã¢ã³ã®ä»¥åã®ã³ããŒã®ããã»ã¹èå¥åã®é·ããé·ããªãå¯èœæ§ãããããããã¡ã€ã«ãµã€ãºã®åãæšãŠãå¿ èŠã§ããããšãã°ã以åã«èµ·åããããŒã¢ã³ã®ã³ããŒã®ããã»ã¹èå¥åã12345ã§ãçŸåšã®ã³ããŒã®ããã»ã¹èå¥åã9999ã§ãããšããŸããã€ãŸãããã®ããŒã¢ã³ãèå¥åãæžã蟌ããšããã¡ã€ã«ã«ã¯99995è¡ãå«ãŸããŸãããã¡ã€ã«ã®åãæšãŠæäœã¯ãããŒã¢ã³ã®ä»¥åã®ã³ããŒã«é¢é£ããæ å ±ãåé€ããŸãã
13.6ãæªéã®æ £ç¿
UNIXã·ã¹ãã ã§ã¯ãããŒã¢ã³ã¯æ¬¡ã®èŠåã«åŸããŸãã
- , /var/run. , , . name.pid, name â . , cron /var/run/crond.pid.
- , /etc. , , name.conf, name â . , syslogd /etc/syslog.conf.
- , (/etc/rc* /etc/init.d/*). , init, respawn /etc/inittab (, init System V).
- , , . , , . SIGHUP, . , , SIGHUP. .
äŸ
ãªã¹ã13.3ã®ããã°ã©ã ã¯ãããŒã¢ã³ã«æ§æãã¡ã€ã«ã®åèªã¿åãã匷å¶ãã1ã€ã®æ¹æ³ã瀺ããŠããŸããã»ã¯ã·ã§ã³12.8ã§èª¬æãããŠããããã«ãããã°ã©ã ã¯sigwaité¢æ°ãšä¿¡å·åŠçã«å¥ã®ã¹ããªãŒã ã䜿çšããŸãã
ãªã¹ã13.3ãã·ã°ãã«ã§æ§æãã¡ã€ã«ãåèªã¿åãããããŒã¢ã³ã®äŸ
#include "apue.h" #include <pthread.h> #include <syslog.h> sigset_t mask; extern int already_running(void); void reread(void) { /* ... */ } void * thr_fn(void *arg) { int err, signo; for (;;) { err = sigwait(&mask, &signo); if (err != 0) { syslog(LOG_ERR, " sigwait"); exit(1); } switch (signo) { case SIGHUP: syslog(LOG_INFO, " "); reread(); break; case SIGTERM: syslog(LOG_INFO, " SIGTERM; "); exit(0); default: syslog(LOG_INFO, " %d\n", signo); } } return(0); } int main(int argc, char *argv[]) { int err; pthread_t tid; char *cmd; struct sigaction sa; if ((cmd = strrchr(argv[0], '/')) == NULL) cmd = argv[0]; else cmd++; /* * . */ daemonize(cmd); /* * , . */ if (already_running()) { syslog(LOG_ERR, " "); exit(1); } /* * SIGHUP * . */ sa.sa_handler = SIG_DFL; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGHUP, &sa, NULL) < 0) err_quit("%s: SIG_DFL SIGHUP"); sigfillset(&mask); if ((err = pthread_sigmask(SIG_BLOCK, &mask, NULL)) != 0) err_exit(err, " SIG_BLOCK"); /* * SIGHUP SIGTERM. */ err = pthread_create(&tid, NULL, thr_fn, 0); if (err != 0) err_exit(err, " "); /* * -. */ /* ... */ exit(0); }
ããŒã¢ã³ã¢ãŒãã«å ¥ãããã«ãããã°ã©ã ã¯ãªã¹ã13.1ã®daemonizeé¢æ°ã䜿çšããŸããããããæ»ã£ãåŸããªã¹ã13.2ã®already_runningé¢æ°ãåŒã³åºãããããŒã¢ã³ã®ä»ã®å®è¡äžã®ã³ããŒããã§ãã¯ããŸãããã®æç¹ã§ã¯ãSIGHUPã·ã°ãã«ã¯ãŸã ç¡èŠãããŠããããããã®äœçœ®ãããã©ã«ãå€ã«ãªã»ããããå¿ èŠããããŸãããªã»ããããªããšãsigwaité¢æ°ã¯ãããåä¿¡ã§ããªããªããŸãã
ããã«ããã«ãã¹ã¬ããããã°ã©ã ã«æšå¥šãããŠããããããã¹ãŠã®ä¿¡å·ããããã¯ãããä¿¡å·åŠçãåŠçããã¹ããªãŒã ãäœæãããŸããã¹ããªãŒã ã¯ãSIGHUPããã³SIGTERMã·ã°ãã«ã®ã¿ãåŠçããŸãã SIGHUPã·ã°ãã«ãåä¿¡ãããšãåèªã¿åãæ©èœã¯æ§æãã¡ã€ã«ãåèªã¿åãããSIGTERMã·ã°ãã«ãåä¿¡ãããšãã¹ããªãŒã ã¯ã¡ãã»ãŒãžããã°ã«æžã蟌ã¿ãããã»ã¹ãçµäºããŸãã
è¡šã®äžã10.1ã¯ãããã©ã«ãã§ãSIGHUPããã³SIGTERMã·ã°ãã«ãããã»ã¹ãçµäºããããšã瀺ããŸãããããã®ã·ã°ãã«ã¯ãããã¯ãããŠãããããããŒã¢ã³ã¯ãããã®ã·ã°ãã«ãåä¿¡ããŠââãçµäºããŸããã代ããã«ãã¹ã¬ããã¯ãsigwaitãåŒã³åºãããšã«ãããé ä¿¡ãããã·ã°ãã«ã®çªå·ãåãåããŸãã
äŸ
ãªã¹ã13.4ã®ããã°ã©ã ã¯ãåå¥ã®ã¹ã¬ããã䜿çšããã«ããŒã¢ã³ãSIGHUPã·ã°ãã«ãã€ã³ã¿ãŒã»ããããæ§æãã¡ã€ã«ãå床èªã¿åãæ¹æ³ã瀺ããŠããŸãã
ãªã¹ã13.4 ã·ã°ãã«ã«ãã£ãŠæ§æãã¡ã€ã«ãåèªã¿åãããããŒã¢ã³ã®ä»£æ¿å®è£
#include "apue.h" #include <syslog.h> #include <errno.h> extern int lockfile(int); extern int already_running(void); void reread(void) { /* ... */ } void sigterm(int signo) { syslog(LOG_INFO, " SIGTERM; "); exit(0); } void sighup(int signo) { syslog(LOG_INFO, " "); reread(); } int main(int argc, char *argv[]) { char *cmd; struct sigaction sa; if ((cmd = strrchr(argv[0], '/')) == NULL) cmd = argv[0]; else cmd++; /* * . */ daemonize(cmd); /* * , . */ if (already_running()) { syslog(LOG_ERR, " "); exit(1); } /* * . */ sa.sa_handler = sigterm; sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask, SIGHUP); sa.sa_flags = 0; if (sigaction(SIGTERM, &sa, NULL) < 0) { syslog(LOG_ERR, " SIGTERM: %s", strerror(errno)); exit(1); } sa.sa_handler = sighup; sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask, SIGTERM); sa.sa_flags = 0; if (sigaction(SIGHUP, &sa, NULL) < 0) { syslog(LOG_ERR, " SIGHUP: %s", strerror(errno)); exit(1); } /* * -. */ /* ... */ exit(0); }
13.7ãã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãã«
ã»ãšãã©ã®å ŽåãããŒã¢ã³ããã»ã¹ã¯ãµãŒããŒããã»ã¹ãšããŠäœ¿çšãããŸãã å³13.1ã¯ãUNIXãã¡ã€ã³ãœã±ãããä»ããŠã¢ããªã±ãŒã·ã§ã³ïŒã¯ã©ã€ã¢ã³ãïŒããã¡ãã»ãŒãžãåä¿¡ããsyslogdãµãŒããŒãšã®å¯Ÿè©±ã®äŸã瀺ããŠããŸãã
äžè¬ã«ããµãŒããŒãšã¯ãç¹å®ã®ãµãŒãã¹ã«å¯ŸããèŠæ±ã顧客ã«æåŸ ããããã»ã¹ãæå³ããŸãããããã£ãŠãå³13.1 syslogdã¯ãšã©ãŒãã®ã³ã°ãµãŒãã¹ãæäŸããŸãã
å³ã«ç€ºã13.1ãµãŒããŒãšã¯ã©ã€ã¢ã³ãéã®çžäºäœçšã¯äžæ¹åã§ããã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒã«ã¡ãã»ãŒãžãéä¿¡ããŸããããµãŒããŒããã¯äœãåä¿¡ããŸããã次ã®ç« ã§ã¯ãã¯ã©ã€ã¢ã³ãããµãŒããŒã«èŠæ±ãéä¿¡ãããµãŒããŒãã¯ã©ã€ã¢ã³ãã«å¿çãè¿ãå Žåã®ããµãŒããŒãšã¯ã©ã€ã¢ã³ãéã®åæ¹åã®ããåãã®å€ãã®äŸãåç §ããŸãã
ãµãŒããŒã¯ãå€ãã®å Žåãforkããã³execã䜿çšããŠä»ã®ããã°ã©ã ãå®è¡ããããšã«ããã顧客ãµãŒãã¹ãæäŸããŸãããã®ãããªãµãŒããŒã¯ãå€ãã®å Žåãçžäºäœçšãšã³ããã€ã³ããæ§æãã¡ã€ã«ããã°ãã¡ã€ã«ãªã©ã®å€ãã®ãã¡ã€ã«èšè¿°åãéããŸããæè¯ã®å Žåãåããã»ã¹ã§èšè¿°åãéãããŸãŸã«ããŠããã®ã¯ç°¡åã§ã¯ãããŸããããã®ããã°ã©ã ãäœããã®æ¹æ³ã§ãµãŒããŒã«æ¥ç¶ãããŠããªãå Žåãææªã®å Žåãã»ãã¥ãªãã£äžã®åé¡ãçºçããå¯èœæ§ããããŸããããšãã°ãèµ·åãããããã°ã©ã ã¯ããµãŒããŒæ§æãã¡ã€ã«ãå€æŽããããã¯ã©ã€ã¢ã³ãããéèŠãªæ å ±ãäžæ£ã«ååŸããŸãã
ãã®åé¡ã®æãç°¡åãªè§£æ±ºçã¯ãèµ·åäžã®ããã°ã©ã ã§å¿ èŠãšãããªããã¹ãŠã®ãã¡ã€ã«èšè¿°åã«å¯ŸããŠexecïŒexec-closeïŒé¢æ°ãåŒã³åºããšãã«çµäºãã©ã°ãèšå®ããããšã§ãããªã¹ã13.5ã¯ããããã®ç®çã®ããã«ãµãŒããŒããã»ã¹ã§äœ¿çšã§ããé¢æ°ã瀺ããŠããŸãã
ãªã¹ã13.5ãexecãåŒã³åºããããšãã«ã¯ããŒãºãã©ã°ãèšå®ãã
#include "apue.h" #include <fcntl.h> int set_cloexec(int fd) { int val; if ((val = fcntl(fd, F_GETFD, 0)) < 0) return(-1); val |= FD_CLOEXEC; /* exec */ return(fcntl(fd, F_SETFD, val)); }
13.8ããŸãšã
ã»ãšãã©ã®å ŽåãããŒã¢ã³ããã»ã¹ã®åäœæéã¯ãã·ã¹ãã èªäœã®åäœæéãšäžèŽããŸããããŒã¢ã³ãšããŠæ©èœããããã°ã©ã ãéçºãããšãã¯ã第9ç« ã§èª¬æããããã»ã¹éã®é¢ä¿ãç解ãââãèæ ®ããå¿ èŠããããŸãããã®ç« ã§ã¯ãããã»ã¹ããåŒã³åºããŠããŒã¢ã³ã¢ãŒãã«æ£ããåãæ¿ããããšãã§ããé¢æ°ãéçºããŸããã
ãŸããéåžžã¯å¶åŸ¡ç«¯æ«ããªããããããŒã¢ã³ã®ãšã©ãŒã¡ãã»ãŒãžãèšé²ããæ¹æ³ã«ã€ããŠã説æããŸããã UNIXã®ã»ãšãã©ã®ããŒãžã§ã³ã§ããŒã¢ã³ãåŸãã¹ãããã€ãã®èŠåãæ€èšãããããã®èŠåã®å®è£ æ¹æ³ã®äŸã瀺ããŸããã
»æ¬ã®è©³çŽ°ã«ã€ããŠã¯ãåºç瀟ã®ãŠã§ããµã€ã㧠èŠã€ããããšãã§ããŸã
» ç®æ¬¡
» æç²
ã¯ãŒãã³20ïŒ å²åŒã«Habrozhiteley - UNIX