``°æÀï »óÅ (race condition)" ´Â "À̺¥Æ®µéÀÇ »ó´ëÀûÀΠŸÀֿ̹¡ ´ëÇÑ µ¹¹ßÀûÀÎ ÀÓ°è ÀÇÁ¸¼º¶§¹®¿¡ ¹ß»ýÇÏ´Â ÀÌ»óÇÑ µ¿ÀÛ" À¸·Î Á¤ÀÇµÉ ¼ö ÀÖ´Ù [FOLDOC]. °æÀï »óÅ´ ÀϹÝÀûÀ¸·Î ÆÄÀÏ ¶Ç´Â º¯¼ö¿Í °°Àº °øÀ¯ ÀÚ¿øÀ» Á¢±ÙÇÏ´Â Çϳª ¶Ç´Â ±× ÀÌ»óÀÇ ÇÁ·Î¼¼½º¸¦ Æ÷ÇÔÇϴµ¥ ÀÌ·¯ÇÑ ´ÙÁß Á¢±ÙÀÌ ÀûÀýÈ÷ Á¦¾îµÇÁö ¾Ê´Â °ÍÀÌ´Ù.
ÀϹÝÀûÀ¸·Î ÇÁ·Î¼¼½º´Â ¿øÀÚÀûÀ¸·Î (atomically) ½ÇÇàµÇÁö ¾Ê´Âµ¥ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ º»·¡ ¾î¶² µÎ ¸í·É »çÀÌ¿¡¼ À̸¦ ÀÎÅÍ·´Æ®ÇÒ ¼öµµ ÀÖ´Ù. º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥ÀÇ ÇÁ·Î¼¼½º°¡ ÀÌ·¯ÇÑ ÀÎÅÍ·´¼Ç¿¡ ´ëºñÇÏÁö ¾Ê¾Ò´Ù¸é ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀÌ ÇÁ·Î¼¼½º¸¦ ¹æÇØÇÒ ¼öµµ ÀÖ´Ù. ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ÀÓÀÇÀÇ Äڵ尡 µÎ ¿¬»ê »çÀÌ¿¡ ½ÇÇàµÈ´Ù ÇÏ´õ¶óµµ ¸ðµç ¿¬»ê½ÖÀÌ ½ÇÆÐÇØ¼´Â ¾ÈµÈ´Ù.
°æÀï »óÅ ¹®Á¦´Â °³³äÀûÀ¸·Î ´ÙÀ½ÀÇ µÎ ¹üÁÖ·Î ºÐ·ùÇÒ ¼ö ÀÖ´Ù:
½Å·ÚµÇÁö ¾ÊÀº ÇÁ·Î¼¼½º¿¡ ÀÇÇÑ °£¼·. ¾î¶² º¸¾È ºÐ·ù¹ýÀº ÀÌ ¹®Á¦¸¦ ``½ÃÄö½º (sequence)" ¶Ç´Â "ºñ¿øÀÚÀû (non-atomic)" »óŶó°í ºÎ¸¥´Ù. ÀÌ´Â ´Ù¸¥ ¿©·¯°¡Áö ÇÁ·Î±×·¥µéÀ» ½ÇÇàÇϰí ÀÖ´Â ÇÁ·Î¼¼½ºµé¿¡ ÀÇÇØ ¾ß±âµÇ´Â »óÅ·Πº¸¾ÈÀûÀÎ ÇÁ·Î±×·¥ÀÇ ´Ü°èµé »çÀÌ¿¡ ´Ù¸¥ µ¿ÀÛÀ» ¸ô·¡ ³Ö´Â °ÍÀ¸·Î ÀÌ·¯ÇÑ ´Ù¸¥ ÇÁ·Î±×·¥µéÀº ¹®Á¦¸¦ ¾ß±âÇÏ·Á´Â °ø°ÝÀÚ¿¡ ÀÇÇØ È£ÃâµÉ ¼öµµ ÀÖ´Ù. ÀÌ Ã¥Àº À̸¦ ½ÃÄö½Ì (sequencing) ¹®Á¦¶ó°í ºÎ¸¦ °ÍÀÌ´Ù.
½Å·ÚµÈ ÇÁ·Î¼¼½º¿¡ ÀÇÇÑ °£¼· (º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥ÀÇ °üÁ¡¿¡¼). ¾î¶² ºÐ·ù¹ýÀº À̸¦ ±³Âø »óÅ (deadlock), livelock ¶Ç´Â locking failure »óŶó°í ºÎ¸¥´Ù. ÀÌ´Â µ¿ÀÏÇÑ ÇÁ·Î±×·¥À» ½ÇÇàÇϰí ÀÖ´Â ÇÁ·Î¼¼½ºµé¿¡ ÀÇÇØ ¾ß±âµÇ´Â »óÅÂÀÌ´Ù. ÀÌ·¯ÇÑ ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ µ¿ÀÏÇÑ ±ÇÇÑÀ» °¡Áú ¼öµµ Àֱ⠶§¹®¿¡ ÀûÀýÈ÷ Á¦¾îµÇÁö ¾Ê´Â´Ù¸é ´Ù¸¥ ÇÁ·Î±×·¥µéÀÌ ½ÇÇàµÉ ¼ö ¾ø°Ô²û ¼·Î¸¦ °£¼·ÇÒ ¼ö ÀÖ´Ù. ¶§¶§·Î ÀÌ·¯ÇÑ À¯ÇüÀÇ °£¼·ÀÌ ¾Ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ Ã¥Àº À̸¦ ·ÎÅ· (locking) ¹®Á¦¶ó°í ºÎ¸¦ °ÍÀÌ´Ù.
ÀϹÝÀûÀ¸·Î ¸ðµç ¿¬»ê½Ö¿¡ ´ëÇØ ÀÓÀÇÀÇ Äڵ尡 ÀÌµé »çÀÌ¿¡¼ ½ÇÇàµÉ ¶§ Äڵ尡 ½ÇÆÐÇÒ ¼ö ÀÖ´ÂÁö °Ë»çÇØ¾ß ÇÑ´Ù.
°øÀ¯ º¯¼ö ÀûÀç ¹× ÀúÀåÀº º¸Åë º°°³ÀÇ ¿¬»êÀ¸·Î ±¸ÇöµÇ¸ç ¿øÀÚÀûÀÌ ¾Æ´ÔÀ» ÁÖ¸ñÇØ¶ó. ÀÌ´Â ``Áõ°¡ º¯¼ö (increment variable)" ¿¬»êÀÌ º¸Åë ÀûÀç, Áõ°¡ ±×¸®°í ÀúÀå ¿¬»êÀ¸·Î º¯È¯µÊÀ» ÀǹÌÇÏ¸ç µû¶ó¼ º¯¼ö ¸Þ¸ð¸®°¡ °øÀ¯µÈ´Ù¸é ´Ù¸¥ ÇÁ·Î¼¼½º°¡ Áõ°¡Çϱ⸦ °£¼·ÇÒ ¼öµµ ÀÖ´Ù.
º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥ÀÌ ¿äûÀÌ Çã°¡µÇ¾ú´ÂÁö¸¦ °áÁ¤ÇØ¾ß ÇÏ¸ç ±×·¸´Ù¸é ±× ¿äû¿¡ µû¶ó ÀÛµ¿ÇØ¾ß ÇÑ´Ù. ½Å·ÚµÇÁö ¾ÊÀº »ç¿ëÀÚ°¡ ÇÁ·Î±×·¥ÀÌ ¿äû¿¡ µû¶ó ÀÛµ¿Çϱâ Àü¿¡ Çã°¡±Ç °áÁ¤¿¡ »ç¿ëµÇ´Â ¾î¶² °Íµµ º¯°æ½Ãų ¼ö ÀÖ´Â ¹æ¹ýÀº ¾ø¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ À¯ÇüÀÇ °æÀï »óÅ´ ¶§¶§·Î "time of check - time of use" (TOCTOU) °æÀï »óÅ·ΠÁöĪµÈ´Ù.
¿øÀÚÀû µ¿ÀÛÀ» ¼öÇàÇÒ ¼ö ¾ø´Ù´Â ¹®Á¦´Â ÆÄÀϽýºÅÛ¿¡¼µµ µÇÇ®ÀÌÇÏ¿© ³ª¿Â´Ù. ÀϹÝÀûÀ¸·Î ÆÄÀϽýºÅÛÀº ¸¹Àº ÇÁ·Î±×·¥µéÀÌ »ç¿ëÇÏ´Â °øÀ¯ ÀÚ¿øÀ¸·Î ¾î¶² ÇÁ·Î±×·¥µéÀº ´Ù¸¥ ÇÁ·Î±×·¥µéÀÌ À̸¦ »ç¿ëÇÏ´Â °ÍÀ» °£¼·ÇÒ ¼öµµ ÀÖ´Ù. º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥µéÀº Çã°¡µÈ ¿äûÀÎÁö¸¦ °áÁ¤Çϱâ À§ÇØ access(2) ¸¦ »ç¿ëÇÏ´Â °ÍÀ» ÇÇÇØ¾ß ÇÑ´Ù. ´ÙÀ½ È£ÃâÀº open(2) ·Î »ç¿ëÀÚµéÀÌ ¾Æ¸¶µµ ½Éº¼¸¯ ¸µÅ© ¶Ç´Â ÀڽŵéÀÌ ¼±ÅÃÇÑ ÆÄÀÏÀ» »ý¼ºÇÔÀ¸·Î½á access(2) ¿Í open(2) È£Ãâ »çÀÌ¿¡ ÆÄÀÏÀ» ÀÚÁÖ ¿Å±æ ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥Àº ´ë½Å ÀÚ½ÅÀÇ À¯È¿ id ¶Ç´Â ÆÄÀϽýºÅÛ id ¸¦ ¼³Á¤ÇÑ ÈÄ Á÷Á¢ÀûÀ¸·Î open ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. access(2) ¸¦ ¾ÈÀüÇÏ°Ô »ç¿ëÇÏ´Â °ÍÀº °¡´ÉÇѵ¥ ´ÜÁö »ç¿ëÀÚ°¡ ÆÄÀÏ ¶Ç´Â ÆÄÀϽýºÅÛ ·çÆ®·ÎºÎÅÍ °æ·Î¿¡ Á¸ÀçÇÏ´Â ¸ðµç µð·ºÅ丮¿¡ ¿µÇâÀ» ¹ÌÄ¥ ¼ö ¾øÀ» ¶§¸¸ °¡´ÉÇÏ´Ù.
ÆÄÀÏÀ» »ý¼ºÇÒ ¶§´Â O_CREAT | O_EXCL ¸ðµå¸¦ »ç¿ëÇØ¼ ¿°í ´ÜÁö ¸Å¿ì Á¦ÇÑµÈ Çã°¡ (´ÜÁö ÇöÀç »ç¿ëÀÚ¿¡°Ô¸¸) ¸¦ ÁÖ¾î¾ß ÇÑ´Ù; ¶ÇÇÑ open ½ÇÆÐ¿¡ ´ëºñÇÒ Çʿ䰡 ÀÖ´Ù. ÆÄÀÏÀ» ¿ÀÇÂÇÒ Çʿ䰡 ÀÖ´Ù¸é (¿¹, ¼ºñ½º ºÎÀÎÀ» ¿¹¹æÇϱâ À§ÇØ) ¹Ýº¹ÀûÀ¸·Î ``ÀÓÀÇÀÇ" ÆÄÀÏ À̸§À» »ý¼ºÇØ, ÀÌ À̸§ÀÇ ÆÄÀÏÀ» ¿ÀÇÂÇÏ°í ¿ÀÇ ¼º°ø½Ã ÀÌ·¯ÇÑ ¹Ýº¹À» ÁßÁöÇÒ Çʿ䰡 ÀÖ´Ù.
ÀÏ¹Ý ÇÁ·Î±×·¥µéÀº ÆÄÀÏÀ» ÀûÀýÈ÷ »ý¼ºÇÏÁö ¾Ê´Â °æ¿ì º¸¾È ¾àÁ¡À» °¡Áú ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ``joe" ÅØ½ºÆ® ÆíÁý±â´Â "DEADJOE" ½Éº¼¸¯ ¸µÅ© Ãë¾à¼ºÀ̶ó°í ºÒ¸®´Â ¾àÁ¡À» °®°í ÀÖ´Ù. ½Ã½ºÅÛ Å©·¡½¬, xterm ´Ý±â ¶Ç´Â ³×Æ®¿öÅ© ¿¬°á ²÷±è°ú °°ÀÌ ºñÇ¥ÁØ ¹æ½ÄÀ¸·Î joe °¡ Á¾·áµÉ ¶§ joe ´Â ¿ÀÇ ¹öÆÛ¸¦ "DEADJOE" ÆÄÀÏ¿¡ ¹«Á¦ÇÑÀ¸·Î µ¡ºÙÀÏ ¼ö ÀÖ´Ù. ÀÌ´Â ·çÆ®°¡ ÀϹÝÀûÀ¸·Î joe ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â µð·ºÅ丮¿¡ DEADJOE ½Éº¼¸¯ ¸µÅ©¸¦ »ý¼ºÇÔÀ¸·Î½á ¾Ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀ¸·Î joe ´Â °¡ºñÁö¸¦ ÀáÀçÀûÀ¸·Î ¹®Á¦°¡ µÉ ¼ö ÀÖ´Â ÆÄÀÏ¿¡ µ¡ºÙÀ̴µ¥ »ç¿ëµÉ ¼ö ÀÖÀ¸¸ç ÀÌ´Â ¼ºñ½º ºÎÀÎ ¹×/¶Ç´Â º»ÀÇ¾Æ´Ñ Á¢±ÙÀ» ¾ß±âÇÒ °ÍÀÌ´Ù.
´Ù¸¥ ¿¹·Î¼ ÆÄÀÏÀÇ ¸ÞŸ Á¤º¸¿¡ ÀÏ·ÃÀÇ ¿¬»ê (¼ÒÀ¯ÀÚ º¯°æ, ÆÄÀÏ stat-ing ¶Ç´Â Çã°¡±Ç ºñÆ® º¯°æ°ú °°Àº) À» ¼öÇàÇÒ ¶§ ¿ì¼± ÆÄÀÏÀ» ¿ÀÇÂÇÑ ÈÄ ÀÌ¿¡ ¿¬»êÀ» Àû¿ëÇØ¶ó. ÀÌ´Â chown(), chgrp() ¿Í chmod() ¿Í °°ÀÌ ÆÄÀÏ À̸§À» ÃëÇÏ´Â ÇÔ¼öµé ´ë½Å fchown(), fstat() ¶Ç´Â fchmod() ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÑ´Ù´Â °ÍÀ» ÀǹÌÇϸç ÇÁ·Î±×·¥À» ÀÛµ¿½ÃŰ´Â µµÁß¿¡ ÆÄÀÏÀÌ ´ëüµÇ´Â °ÍÀ» ¸·À» ¼ö ÀÖÀ» °ÍÀÌ´Ù (°¡´ÉÇÑ °æÀï »óÅÂ). ¿¹¸¦ µé¾î ÆÄÀÏÀ» ´ÝÀº ÈÄ chmod() ¸¦ »ç¿ëÇØ¼ Çã°¡±ÇÀ» º¯°æÇÑ´Ù¸é °ø°ÝÀÚ°¡ ÀÌ µÎ ´Ü°è »çÀÌ¿¡ ÆÄÀÏÀ» À̵¿ ¹× Á¦°ÅÇØ¼ ´Ù¸¥ ÆÄÀÏ (/etc/passwd °ú °°Àº) ¿¡ ´ëÇÑ ½Éº¼¸¯ ¸µÅ©¸¦ »ý¼ºÇÒ ¼öµµ ÀÖ´Ù. ´Ù¸¥ Àç¹ÌÀÖ´Â ÆÄÀÏÀº /dev/zero ·Î ÀÌ´Â ÇÁ·Î±×·¥¿¡ ¹«ÇÑÈ÷ ±ä ÀÔ·Â µ¥ÀÌŸ ½ºÆ®¸²À» Á¦°øÇÒ ¼ö ÀÖ´Ù; °ø°ÝÀÚ°¡ ÆÄÀÏÀÇ Áß°£ ½ºÆ®¸²À» ``±³È¯" ÇÒ ¼ö ÀÖ´Ù¸é °á°ú´Â À§ÇèÇÒ ¼ö ÀÖ´Ù.
±×·¯³ª ÀÌ´Â º¹ÀâÇØÁø´Ù - ÆÄÀϵéÀ» »ý¼ºÇÒ ¶§ À̵鿡°Ô °¡´ÉÇÑ ÃÖ¼ÒÇÑÀÇ ±ÇÇѼÂÀ» ÁÖ¾î¾ß ÇÏ¸ç ±× ÈÄ ¿øÇÒ ¶§ ±ÇÇÑÀ» ´õ¿í È®´ë º¯°æÇØ¾ß ÇÑ´Ù. ÀϹÝÀûÀ¸·Î ÀÌ´Â ´ÜÁö »ç¿ëÀÚ¿Í »ç¿ëÀÚ ±×·ì¿¡ ´ëÇØ Ãʱâ Á¢±ÙÀ» Á¦ÇÑÇϱâ À§ÇØ umask ¹×/¶Ç´Â open ¸Å°³º¯¼ö¸¦ »ç¿ëÇØ¾ß ÇÔÀ» ÀǹÌÇÑ´Ù. ¿¹¸¦ µé¾î Ãʱ⿡ ¸ðµÎ ´Ù ÀÐÀ» ¼ö ÀÖ´Â ÆÄÀÏÀ» »ý¼ºÇÑ ÈÄ ``world-readable" ºñÆ®¸¦ ¾ø¾Ö·Á°í Çϸé Çã°¡±Ç ºñÆ®°¡ ¹«¹æÇÏ´Ù°í ¸»ÇÑ µ¿¾È¿¡ °ø°ÝÀÚ´Â ÆÄÀÏÀ» ¿ÀÇÂÇÏ·Á°í ÇÒ ¼ö ÀÖ´Ù. ´ëºÎºÐÀÇ À¯´Ð½º °è¿ ½Ã½ºÅÛ¿¡¼ Çã°¡±ÇÀº ¿Àǽÿ¡¸¸ °Ë»çµÇ´Âµ¥ µû¶ó¼ °ø°ÝÀÚ°¡ ÀǵµÇÑ °Íº¸´Ù ´õ¿í ¸¹Àº ±ÇÇÑÀ» °®°Ô µÉ °ÍÀÌ´Ù.
ÀϹÝÀûÀ¸·Î ´Ù¼öÀÇ »ç¿ëÀÚ°¡ À¯´Ð½º °è¿ ½Ã½ºÅÛÀÇ µð·ºÅ丮¿¡ ¾²±â¸¦ ÇÒ ¼ö ÀÖÀ¸·Á¸é ±× µð·ºÅ丮¿¡ ``sticky" ºñÆ®¸¦ ¼³Á¤ÇÏ´Â °ÍÀÌ ´õ¿í ÁÁÀ» °ÍÀÌ´Ù. ÀÌ·¯ÇÑ sticky µð·ºÅ丮´Â ´õ¿í Àß ±¸ÇöµÇ¾î¿Ô´Ù. ±×·¯³ª ¹®Á¦¸¦ ¿ÏÀüÈ÷ ÇÇÇÏ´Â °ÍÀÌ ´õ¿í ÁÁÀºµ¥ ´ÜÁö ½Å·ÚµÈ Ưº° ÇÁ·Î¼¼½º¸¸ÀÌ Á¢±ÙÇÒ ¼ö ÀÖ´Â µð·ºÅ丮¸¦ ¸¸µé¾î¶ó (±× ÈÄ À̸¦ ÁÖÀDZí°Ô ±¸ÇöÇØ¶ó). ÀüÅëÀûÀÎ À¯´Ð½ºÀÇ ÀϽÃÀûÀÎ µð·ºÅ丮 (/tmp ¿Í /var/tmp) ´Â º¸Åë ``sticky" µð·ºÅ丮·Î ±¸ÇöµÇÁö¸¸ ´ÙÀ½¿¡ º¸µíÀÌ ¸ðµç À¯ÇüÀÇ ¸ðµç ¹®Á¦°¡ ¿ª½Ã Ç¥¸éÈÇÒ °ÍÀÌ´Ù.
¿øÀÚÀû ¿¬»êÀ» Á¤È®È÷ ¼öÇàÇÏ´Â ¹®Á¦´Â Àӽà ÆÄÀϵéÀ» »ý¼ºÇÒ ¶§ ƯÈ÷ ³ªÅ¸³´Ù. À¯´Ð½º °è¿ ½Ã½ºÅÛ¿¡¼ Àӽà ÆÄÀϵéÀº ¸ðµç »ç¿ëÀÚµéÀÌ °øÀ¯ÇÏ´Â /tmp ¶Ç´Â /var/tmp µð·ºÅ丮¿¡ ÀϹÝÀûÀ¸·Î »ý¼ºµÈ´Ù. °ø°ÝÀÚµéÀÌ °øÅëÀûÀ¸·Î »ç¿ëÇÏ´Â ¼ö¹ýÀº º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥ÀÌ ÀÛµ¿ÇÏ´Â µ¿¾È Àӽà µð·ºÅ丮³»¿¡ ¾î¶² ´Ù¸¥ ÆÄÀÏ (¿¹, /etc/passwd) ¿¡ ´ëÇÑ ½Éº¼¸¯ ¸µÅ©¸¦ »ý¼ºÇÏ´Â °ÍÀÌ´Ù. °ø°ÝÀÚÀÇ ¸ñÀûÀº º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥ÀÌ ÁÖ¾îÁø ÆÄÀÏ À̸§ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù°í °áÁ¤ÇÒ »óȲÀ» ¸¸µå´Â °ÍÀ¸·Î °ø°ÝÀÚ°¡ ´Ù¸¥ ÆÄÀÏ¿¡ ´ëÇÑ ½Éº¼¸¯ ¸µÅ©¸¦ ¸¸µç ÈÄ¿¡ º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥ÀÌ ¾î¶² ¿¬»êÀ» ¼öÇà (±×·¯³ª ½ÇÁ¦·Î´Â ÀǵµÇÏÁö ¾ÊÀº ÆÄÀÏÀ» ¿ÀÇÂÇß´Ù) ÇÏ°Ô µÈ´Ù. ¶§¶§·Î Áß¿äÇÑ ÆÄÀϵéÀº ÀÌ·±½ÄÀ¸·Î Ÿ°ÝÀ» ¹Þ°Å³ª ¼öÁ¤µÉ ¼ö ÀÖ´Ù. ÀÏ¹Ý ÆÄÀÏ »ý¼º°ú °°ÀÌ ÀÌ °ø°ÝÀÇ ¸¹Àº º¯ÇüÀÌ Àִµ¥ À̵éÀº ¸ðµÎ °ø°ÝÀÚ°¡ Àӽà ÆÄÀϵ鿡 ´ëÇØ º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥ÀÌ »ç¿ëÇÏ´Â µ¿ÀÏ µð·ºÅ丮¿¡ ÆÄÀϽýºÅÛ °´Ã¼¸¦ »ý¼º (¶Ç´Â Á¢±Ù) ÇÒ ¼ö ÀÖ´Ù´Â °³³ä¿¡ ±âÃÊÇÑ´Ù.
ÀÌ·¯ÇÑ °øÀ¯ µð·ºÅ丮¿¡ ÆÄÀϵéÀ» »ý¼ºÇÒ ¶§ ÀϹÝÀûÀÎ ¹®Á¦´Â »ç¿ëÇÏ·Á°í ÇÏ´Â ÆÄÀÏ À̸§ÀÌ »ý¼º½Ã ÀÌ¹Ì Á¸ÀçÇÏÁö ¾ÊÀ½À» º¸ÀåÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ÆÄÀÏ »ý¼º Àü¿¡ À̸¦ °Ë»çÇÏ´Â °ÍÀº È¿°úÀûÀÌÁö ¾ÊÀºµ¥ ÀÌ´Â °Ë»ç ÈÄ¿¡ ±×·¯³ª »ý¼º Àü¿¡ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ±× ÆÄÀÏ À̸§À» °®´Â ÆÄÀÏÀ» »ý¼ºÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ``¿¹ÃøÇÒ ¼ö ¾ø´Â" ¶Ç´Â ``À¯ÀÏÇÑ" ÆÄÀÏ À̸§ »ç¿ëµµ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ¼º°øÇÒ ¶§±îÁö ¹Ýº¹ÀûÀ¸·Î À̸§À» ÃßÃøÇÒ ¼ö Àֱ⠶§¹®¿¡ ÀϹÝÀûÀ¸·Î È¿°úÀûÀÌÁö ¾Ê´Ù.
±âº»ÀûÀ¸·Î °øÀ¯ (sticky) µð·ºÅ丮¿¡ Àӽà ÆÄÀÏÀ» »ý¼ºÇϱâ À§Çؼ´Â (1) ``ÀÓÀÇÀÇ" ÆÄÀÏ À̸§ »ý¼º, (2) O_CREAT | O_EXCL ¹× ¸Å¿ì Á¦ÇÑµÈ Çã°¡±ÇÀ» »ç¿ëÇÑ ¿ÀÇ ¹× (3) ¿ÀÇ ¼º°ø½Ã ÁßÁö À̵éÀ» ¹Ýº¹ÀûÀ¸·Î ÇØ¾ßÇÑ´Ù.
1997 ³â ``Single Unix Specification" ¿¡ µû¸£¸é ÀÓÀÇÀÇ Àӽà ÆÄÀÏÀ» »ý¼ºÇÒ ¶§ ¼±È£µÇ´Â ¹æ¹ýÀº tmpfile(3) ÀÌ´Ù. tmpfile(3) ÇÔ¼ö´Â Àӽà ÆÄÀÏÀ» »ý¼ºÇÏ¿© ÇØ´ç ½ºÆ®¸²À» ¿ÀÇÂÇÏ¸ç ±× ½ºÆ®¸²À» ¹ÝȯÇÑ´Ù (¹ÝȯÇÏÁö ¾Ê´Â´Ù¸é NULL). ºÒÇàÈ÷µµ ½ºÆåÀº ÆÄÀÏÀÌ º¸¾ÈÀûÀ¸·Î »ý¼ºµÉ °ÍÀÎÁö¿¡ ´ëÇØ ¾Æ¹«·± º¸Àåµµ ÇÏÁö ¾Ê°í Àִµ¥ ÀúÀÚ Àڽŵµ ¸ðµç ±¸ÇöÀÌ À̸¦ ¾ÈÀüÇÏ°Ô ÇÏ´ÂÁö º¸ÁõÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ¿°·ÁÇϰí ÀÖ´Ù°í ÀÌ Ã¥ÀÇ Ãʱ⠹öÀü¿¡¼ ¸»Çß´Ù. ±× ÈÄ ¿¹Àü System V ½Ã½ºÅÛÀÌ tmpfile(3) (¿Í tmpnam(3) ¹×tempnam(3)) ¸¦ ºñº¸¾ÈÀûÀ¸·Î ±¸ÇöÇßÀ½À» ¹ß°ßÇß´Ù. tmpfile(3)ÀÇ ¶óÀ̺귯¸® ±¸ÇöÀº Àӽà ÆÄÀÏÀ» º¸¾ÈÀûÀ¸·Î »ý¼ºÇØ¾ß ÇÏÁö¸¸ »ç¿ëÀÚ°¡ ½Ã½ºÅÛ ¶óÀ̺귯¸®°¡ ÀÌ·¯ÇÑ º¸¾È °áÁ¡À» °®°í ÀÖ´Ù°í ´Ã ÀνÄÇÏÁö´Â ¸øÇÏ¸ç ¶§¶§·Î »ç¿ëÀÚ°¡ ÇÒ ¼ö ÀÖ´Â °ÍÀº ¾Æ¹« °Íµµ ¾ø´Ù.
Kris Kennaway ´Â ÀϹÝÀûÀ¸·Î Àӽà ÆÄÀϵéÀ» ¸¸µé¶§ mkstemp(3) ¸¦ »ç¿ëÇ϶ó°í ÃßõÇÑ´Ù. ±×ÀÇ ³í¸®Àû ±Ù°Å´Â ÀÌ Å½ºÅ©¸¦ ¼öÇàÇϱâ À§Çؼ´Â °¢ÀÚÀÇ ÇÔ¼ö¸¦ µ¹¸®´Â ´ë½Å Àß ¾Ë·ÁÁø ¶óÀ̺귯¸® ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß Çϸç ÀÌ ÇÔ¼ö°¡ Àß ¾Ë·ÁÁø ÀÇ¹Ì Ã¼°è¸¦ °®°í ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÌ´Â È®½ÇÈ÷ ±Ù°ÅÀÖ´Â °ßÇØÀÌ´Ù. ÀúÀÚ´Â mkstemp(3) ¸¦ »ç¿ëÇÏ·Á¸é ´ÜÁö ¼ÒÀ¯ÀÚ¿¡°Ô¸¸ Àӽà ÆÄÀÏ Çã°¡±ÇÀ» Á¦ÇÑÇϱâ À§ÇØ ¹Ýµå½Ã umask(2) ¸¦ »ç¿ëÇ϶ó°í µ¡ºÙÀδÙ. ÀÌ´Â mkstemp(3) ÀÇ ¸î¸î ±¸Çö (±âº»ÀûÀ¸·Î ¿¹Àü ±¸Çö) ÀÌ Àӽà ÆÄÀÏÀ» all readable ¹× writable ÇÏ°Ô ¸¸µé¾î °ø°ÝÀÚ°¡ µð·ºÅ丮³»¿¡ ºñ¹Ð ÀڷḦ Àаųª ¾µ ¼ö ÀÖ´Â »óŸ¦ ¸¸µé ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¾à°£ ±ÍÂúÀº °ÍÀº mkstemp(3) °¡ ȯ°æ º¯¼ö TMP ¶Ç´Â TMPDIR ¸¦ Á÷Á¢ÀûÀ¸·Î Áö¿øÇÏÁö ¾Ê´Â´Ù´Â °ÍÀε¥ µû¶ó¼ ȯ°æ º¯¼ö¸¦ Áö¿øÇÏ·Á¸é Äڵ带 Ãß°¡ÇØ¾ß ÇÑ´Ù. ´ÙÀ½Àº ÀÌ·¯ÇÑ ¸ñÀû ¹× TMP ¿Í TMPDIR ¿¡ ´ëÇÑ Áö¿øÀ» Ãß°¡ÇÒ ¶§ mkstemp(3) ¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÏ´Â C ÇÁ·Î±×·¥ÀÌ´Ù.
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> void failure(msg) { fprintf(stderr, "%s\n", msg); exit(1); } /* * Àӽà ÆÄÀÏÀ̸§¿¡ ´ëÇÑ "ÆÐÅÏ"ÀÌ ÁÖ¾îÁö¸é * (µð·ºÅ丮 À§Ä¡·Î ½ÃÀÛÇØ XXXXXX ·Î ³¡³ª´Â) * ÆÄÀÏÀ» »ý¼ºÇØ À̸¦ ¹ÝÈ¯ÇØ¶ó. * ÀÌ ·çƾÀº ÆÄÀÏÀ» ¾ð¸µÅ©½ÃŰ¸ç µû¶ó¼ º¸Åë µð·ºÅ丮 ¸®½ºÆÃ½Ã * ÀÌ ÆÄÀÏÀº º¸ÀÌÁö ¾ÊÀ» °ÍÀÌ´Ù. * ÆÐÅÏÀº ÃÖÁ¾ ÆÄÀÏÀ̸§À» º¸À̵µ·Ï º¯°æµÉ °ÍÀÌ´Ù. */ FILE *create_tempfile(char *temp_filename_pattern) { int temp_fd; mode_t old_mode; FILE *temp_file; old_mode = umask(077); /* Á¦ÇÑÀûÀÎ Çã°¡±ÇÀ» °®´Â ÆÄÀÏÀ» »ý¼º */ temp_fd = mkstemp(temp_filename_pattern); (void) umask(old_mode); if (temp_fd == -1) { failure("Couldn't open temporary file"); } if (!(temp_file = fdopen(temp_fd, "w+b"))) { failure("Couldn't create temporary file's file descriptor"); } if (unlink(temp_filename_pattern) == -1) { failure("Couldn't unlink temporary file"); } return temp_file; } /* * "ű×" (XXXXXX ·Î ³¡³ª´Â »ó´ëÀû ÆÄÀÏ À̸§) °¡ ÁÖ¾îÁö¸é * ű׸¦ »ç¿ëÇØ Àӽà ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. ȯ°æ º¯¼ö TMP ¶Ç´Â * TMPDIR ¿¡ Á¤ÀǵǾî ÀÖ°í setuid/setgid °¡ ¾Æ´Ï¶ó¸é ÀÌ º¯¼ö¿¡ * ÁöÁ¤µÈ µð·ºÅ丮¿¡ ÆÄÀÏÀÌ »ý¼ºµÉ °ÍÀÌ´Ù. * ±×·¸Áö ¾ÊÀº °æ¿ì´Â /tmp µð·ºÅ丮¿¡ »ý¼ºµÉ °ÍÀÌ´Ù. * ·çÆ® (¹× su µÈ ·çÆ®) ´Â TMPDIR or TMP (ÀÌ Á¤ÀǵǾî ÀÖ´Ù¸é) * ¸¦ »ç¿ëÇÒ °ÍÀÓÀ» ÁÖ¸ñÇØ¶ó. */ FILE *smart_create_tempfile(char *tag) { char *tmpdir = NULL; char *pattern; FILE *result; if ((getuid()==geteuid()) && (getgid()==getegid())) { if (! ((tmpdir=getenv("TMPDIR")))) { tmpdir=getenv("TMP"); } } if (!tmpdir) {tmpdir = "/tmp";} pattern = malloc(strlen(tmpdir)+strlen(tag)+2); if (!pattern) { failure("Could not malloc tempfile pattern"); } strcpy(pattern, tmpdir); strcat(pattern, "/"); strcat(pattern, tag); result = create_tempfile(pattern); free(pattern); return result; } main() { int c; FILE *demo_temp_file1; FILE *demo_temp_file2; char demo_temp_filename1[] = "/tmp/demoXXXXXX"; char demo_temp_filename2[] = "second-demoXXXXXX"; demo_temp_file1 = create_tempfile(demo_temp_filename1); demo_temp_file2 = smart_create_tempfile(demo_temp_filename2); fprintf(demo_temp_file2, "This is a test.\n"); printf("Printing temporary file contents:\n"); rewind(demo_temp_file2); while ( (c=fgetc(demo_temp_file2)) != EOF) { putchar(c); } putchar('\n'); printf("Exiting; you'll notice that there are no temporary files on exit.\n"); } |
Kennaway ´Â mkstemp(3) ¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù¸é mkdtemp(3) ¸¦ »ç¿ëÇÏ¿© ¿ÜºÎ·ÎºÎÅÍ º¸È£µÇ´Â µð·ºÅ丮¸¦ °¢ÀÚ ¸¸µé¶ó°í ¾ð±ÞÇϰí ÀÖ´Ù. ¸¶Áö¸·À¸·Î ½ÇÁ¦ ºñº¸¾ÈÀûÀÎ mktemp(3) ¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù¸é ¸¹Àº X ¸¦ »ç¿ëÇØ¶ó - ±×´Â ÆÄÀÏ À̸§ÀÌ ½±°Ô ÃßÃøµÉ ¼ö ¾øµµ·Ï 10 (libc °¡ À̸¦ Çã¿ëÇÑ´Ù¸é) À» Á¦¾ÈÇϰí ÀÖ´Ù (´ÜÁö 6 °³ÀÇ X ¸¦ »ç¿ëÇÑ´Ù´Â °ÍÀº 5 °³¸¦ PID °¡ Â÷ÁöÇÏ¿© ´ÜÁö ÇѰ³ÀÇ ÀÓÀÇ ¹®ÀÚ¸¦ ³²±â°í °ø°ÜÀÚ·Î ÇÏ¿©±Ý ¼Õ½±°Ô °æÀï »óŸ¦ Çã¿ëÇÔÀ» ÀǹÌÇÑ´Ù). ÀúÀÚ´Â tmpname(3) »ç¿ëÀ» ÇÇÇØ¾ß ÇÑ´Ù°í ºÎ¾ðÇÑ´Ù - ÀÌµé »ç¿ëÀÇ ÀϺδ ¾²·¹µå°¡ Á¸ÀçÇÒ ¶§ ½Å·ÚÇÒ ¼ö ¾øÀ¸¸ç TMP_MAX »ç¿ë (°¡Àå ½Ç¿ëÀûÀ¸·Î »ç¿ëÇÏ´Â °ÍÀº ·çÇÁ ³»¿¡¼ÀÌ´Ù) ÈÄ¿¡ ÀûÀýÈ÷ ÀÛµ¿ÇÒ °ÍÀ̶ó°í º¸ÀåÇÏÁö ¾Ê´Â´Ù.
ÀϹÝÀûÀ¸·Î mktemp(3) ¶Ç´Â tmpnam(3) °ú °°Àº ÇÔ¼öÀÇ ºñº¸¾È¼º¿¡ ´ëóÇÒ Æ¯º°ÇÑ Á¶Ä¡¸¦ ÃëÇÏÁö ¾Ê¾Ò°Å³ª º¸¾ÈÀûÀÎ ¶óÀ̺귯¸® ±¸ÇöÀ» ¼³Ä¡ ÀÛ¾÷ÀÇ ÀϺκÐÀ¸·Î Å×½ºÆ®ÇÏÁö ¾Ê¾Ò´Ù¸é À̵éÀÇ »ç¿ëÀ» ÇÇÇØ¾ß ÇÑ´Ù. ±×·³¿¡µµ /tmp ¶Ç´Â world-writable µð·ºÅ丮 (¶Ç´Â ±×·ìÀ» ½Å·ÚÇÏÁö ¾Ê´Â °æ¿ì group-writable) ³»¿¡ ÆÄÀÏÀ» ¸¸µé·Á°í ÇÏ¸é¼ mk*temp() ¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸·Á°í ÇÑ´Ù¸é (¿¹, ÆÄÀÏ À̸§ÀÌ ¿¹ÃøµÉ ¼ö ÀÖ°Ô ÇÏ·Á¸é) ´Ã open() ¿¡ O_CREAT ¿Í O_EXCL Ç÷¡±×¸¦ »ç¿ëÇÏ°í ¹Ýȯ°ªÀ» °Ë»çÇØ¶ó. open() È£ÃâÀ» ÇÒ ¼ö ¾ø´Ù¸é ¿ø·¡´ë·Î º¹±ÍÇØ¶ó (¿¹, exit).
GNOME ÇÁ·Î±×·¡¹Ö ÁöħÀº °øÀ¯ (ÀÓ½Ã) µð·ºÅ丮¿¡ º¸¾È ¿ÀÇ Àӽà ÆÄÀϵ鿡 ´ëÇÑ ÆÄÀϽýºÅÛ °´Ã¼¸¦ »ý¼ºÇÒ ¶§ ´ÙÀ½ Äڵ带 ÃßõÇÑ´Ù[Quintero 2000]:
char *filename; int fd; do { filename = tempnam (NULL, "foo"); fd = open (filename, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0600); free (filename); } while (fd == -1); |
ºñº¸¾ÈÀûÀÎ tempnam(3) ÇÔ¼ö°¡ »ç¿ëµÇ°í ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í º¸¾È ¾àÁ¡¿¡ ´ëóÇϱâ À§ÇØ O_CREAT ¿Í O_EXCL À» »ç¿ëÇÏ¿© ·çÇÁ³»¿¡¼ wrapped µÊÀ» ÁÖ¸ñÇØ¶ó. ÆÄÀÏ À̸§À» free() ÇÒ Çʿ䰡 ÀÖÀ½À» ÁÖ¸ñÇØ¶ó. ÀÛ¾÷À» ¸¶Ä£ ÈÄ ÆÄÀÏÀ» close() ¹× unlink() ÇØ¾ß ÇÑ´Ù. Ç¥ÁØ C I/O ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ±æ ¿øÇÑ´Ù¸é ÆÄÀÏ ±â¼úÀÚ¸¦ FILE * ·Î º¯È¯½Ã۱â À§ÇØ "w+b" ¸ðµå·Î fdopen() À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ Á¢±Ù ¹æ¹ýÀº ¿¹Àü NFS °¡ Á¤È®È÷ O_EXCL À» Áö¿øÇÏÁö ¾Ê±â ¶§¹®¿¡ NFS ¹öÀü 2 ¿¡¼´Â ÀÛµ¿µÇÁö ¾ÊÀ½À» ÁÖ¸ñÇØ¶ó. ÇѰ¡Áö Áß¿äÇÏÁö ¾ÊÀº ´ÜÁ¡Àº tempnam ÀÌ ºñº¸¾ÈÀûÀ¸·Î »ç¿ëµÉ ¼ö Àֱ⠶§¹®¿¡ ´Ù¾çÇÑ ÄÄÆÄÀÏ·¯¿Í º¸¾È ½ºÄ³³Ê°¡ ÀÌ »ç¿ë¿¡ ´ëÇØ °¡Â¥ °æ°í¸¦ ÁÙ ¼ö ÀÖÀ½À» ÁÖ¸ñÇØ¶ó. ÀÌ·¯ÇÑ ¹®Á¦´Â mkstemp(3) ¿¡´Â ¾ø´Ù.
½© ½ºÅ©¸³Æ®¿¡¼ Àӽà ÆÄÀÏÀÌ ÇÊ¿äÇÏ´Ù¸é ÆÄÀÌÇÁ, Áö¿ª µð·ºÅ丮 (¿¹, »ç¿ëÀÚ È¨µð·ºÅ丮 ³»ºÎÀÇ ¾î¶² µð·ºÅ丮) ¶Ç´Â ¾î¶² °æ¿ì¿¡´Â ÇöÀç µð·ºÅ丮¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¾Æ¸¶ °¡Àå ÁÁ´Ù. ÀÌ·± ¹æ½Ä¿¡¼´Â »ç¿ëÀÚ°¡ Çã¿ëÇÏÁö ¾Ê´Â´Ù¸é ¾î¶°ÇÑ °øÀ¯ÇÏ´Â °Íµµ ¾ø´Ù. Á¤¸»·Î /tmp ¿Í °°Àº °øÀ¯ µð·ºÅ丮³»¿¡ Àӽà ÆÄÀÏÀ» ¿øÇϰųª/ÇÊ¿äÇÏ´Ù¸é ÅÛÇø´¿¡ ÇÁ·Î¼¼½º id ¸¦ »ç¿ëÇØ¼ ´ÜÁö ">" °°Àº ÀÏ¹Ý ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ÆÄÀÏÀ» »ý¼ºÇÏ´Â ÀüÅëÀûÀÎ ½© ±â¹ýÀ» »ç¿ëÇÏÁö ¸¶¶ó. ½© ½ºÅ©¸³Æ®°¡ PID ¸¦ ÁöÁ¤Çϱâ À§ÇØ "$$" ¸¦ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ PID ´Â µ¿ÀÏÇÑ À̸§À» °®´Â ÆÄÀÏ ¶Ç´Â ¸µÅ©¸¦ ¹Ì¸® »ý¼ºÇÒ ¼ö ÀÖ´Â °ø°ÝÀÚ¿¡ ÀÇÇØ ½±°Ô °áÁ¤ ¶Ç´Â ÃßÃøµÉ ¼ö ÀÖ´Ù. µû¶ó¼ ´ÙÀ½ÀÇ "ÀϹÝÀûÀÎ" ½© ½ºÅ©¸³Æ®´Â ¾ÈÀüÇÏÁö ¾Ê´Ù:
echo "This is a test" > /tmp/test$$ # DON'T DO THIS. |
½© ½ºÅ©¸³Æ®¿¡ Àӽà ÆÄÀÏ ¶Ç´Â µð·ºÅ丮°¡ Çʿ䰡°í À̸¦ /tmp ¹Ø¿¡ ³õ±æ ¿øÇÑ´Ù¸é ½© ½ºÅ©¸³Æ®¿¡¼ »ç¿ëÇÒ ¸ñÀûÀ¸·Î ¸¸µé¾îÁø mktemp(1) °¡ ¾Æ¸¶µµ ÇØ°áÃ¥ÀÌ´Ù. mktemp(1) °ú mktemp(3) Àº ´Ù¸¥ ÇÔ¼öÀÓÀ» ÁÖ¸ñÇØ¶ó - ¾ÈÀüÇÑ ÇÔ¼ö´Â mktemp(1) ÀÌ´Ù. ¼ÖÁ÷È÷ ÀúÀÚ´Â °øÀ¯ µð·ºÅ丮¿¡ Àӽà ÆÄÀÏÀ» »ý¼ºÇÏ´Â ½© ½ºÅ©¸³Æ®¿¡ Èï¹Ì¸¦ ´À³¢Áö ¾Ê´Â´Ù; ±â¹Ð µð·ºÅ丮¿¡ ÀÌ·¯ÇÑ ÆÄÀÏÀ» »ý¼ºÇϰųª ´ë½Å ÆÄÀÌÇÁ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÀϹÝÀûÀ¸·Î ¹Ù¶÷Á÷ÇÏ´Ù. ±×·¯³ª Á¤¸»·Î ÀÌ·¸°Ô ÇÏ°í ½Í´Ù¸é ´ÙÀ½À» »ç¿ëÇØ¶ó; mktemp(1) Àº ÅÛÇø´À» ÃëÇÑ ÈÄ O_EXCL À» »ç¿ëÇØ¼ ÆÄÀÏ ¶Ç´Â µð·ºÅ丮¸¦ »ý¼ºÇÏ°í ±× À̸§À» ¹ÝȯÇÑ´Ù; ÀÌ´Â O_EXCL À» »ç¿ëÇϱ⠶§¹®¿¡ µð·ºÅ丮°¡ NFS ¹öÀü 2 ¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é /tmp °°Àº °øÀ¯ µð·ºÅ丮¿¡ ´ëÇØ ¾ÈÀüÇÑ´Ù. ´ÙÀ½ Bourne ½© ½ºÅ©¸³Æ®¿¡¼ mktemp(1) À» Á¤È®È÷ »ç¿ëÇÑ ¿¹ÀÌ´Ù; ÀÌ ¿¹´Â mktemp(1) ¸Ç ÆäÀÌÁö¿¡¼ ¾òÀ» ¼ö ÀÖ´Ù:
# mktemp(1) ÀÇ °£´ÜÇÑ »ç¿ë¿¹·Î ½ºÅ©¸³Æ®°¡ ¾ÈÀüÇÑ Àӽà ÆÄÀÏÀ» # ¾òÀ» ¼ö ¾ø´Ù¸é Á¾·áÇÏ´Â ½ºÅ©¸³Æ®ÀÌ´Ù. TMPFILE=`mktemp /tmp/$0.XXXXXX` || exit 1 echo "program output" >> $TMPFILE # ¿¡·¯¸¦ ÀâÀ¸·Á°í ÇÏ´Â °æ¿ìÀÇ °£´ÜÇÑ ¿¹: TMPFILE=`mktemp -q /tmp/$0.XXXXXX` if [ $? -ne 0 ]; then echo "$0: Can't create temp file, exiting..." exit 1 fi |
óÀ½¿¡ º¸¾ÈÀûÀÎ Àӽà ÆÄÀÏ À̸§À» ¾ò¾ú´Ù°í ÇÏ´õ¶óµµ ÀÌ À̸§À» Àç»ç¿ëÇÏÁö ¸¶¶ó (Á¦°ÅÇÑ ÈÄ ´Ù½Ã »ý¼ºÇضó). °ø°ÝÀÚ°¡ µÎ¹øÂ°·Î À̸¦ Àç»ý¼ºÇϱâ Àü¿¡ ¿ø·¡ ÆÄÀÏ À̸§À» º¸°í ÀÖ´Ù°¡ À̸¦ ³¬¾ÆÃ§ ¼ö ÀÖ´Ù. ¹°·Ð ´Ã ÀûÀýÇÑ ÆÄÀÏ Çã°¡±ÇÀ» »ç¿ëÇØ¶ó. ¿¹¸¦ µé¾î ÆÄÀÏ¿¡ world ¶Ç´Â group Á¢±ÙÀÌ ÇÊ¿äÇÏ´Ù¸é world/group Á¢±Ù¸¸ Çã¿ëÇØ¶ó ±×·¸Áö ¾Ê´Ù¸é 0600 ¸ðµå·Î À¯ÁöÇØ¶ó (Áï, ¼ÒÀ¯ÀÚ¸¸ÀÌ ÀÐ°í ¾µ ¼ö ÀÖ´Ù).
µð·ºÅ丮 ¿£Æ®¸®´Â ¾ø¾îÁöÁö¸¸ À̸¦ °¡¸®Å°°í ÀÖ´Â ¸¶Áö¸· ÆÄÀÏ ±â¼úÀÚ°¡ ´ÝÈú ¶§±îÁö ÆÄÀÏ ÀÚü´Â Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï exit Çڵ鷯¸¦ »ç¿ëÇϰųª À¯´Ð½º ÆÄÀϽýºÅÛ ÀÇ¹Ì Ã¼°è »ç¿ë ¹× »ý¼º ÈÄ Áï°¢ÀûÀ¸·Î ÆÄÀÏÀ» unlink() ÇÔÀ¸·Î½á ½º½º·Î Á¤¸®Çضó. ÆÄÀÏ ±â¼úÀÚ¸¦ °Ç³×ÁÜÀ¸·Î½á ÇÁ·Î±×·¥³»¿¡¼ À̸¦ °è¼ÓÇØ¼ Á¢±ÙÇÒ ¼ö Àִµ¥ ÆÄÀÏÀ» unlinking ÇÏ´Â °ÍÀº ÄÚµå À¯Áö º¸¼ö¿¡ ¸¹Àº ÀåÁ¡ÀÌ ÀÖ´Ù: ÇÁ·Î±×·¥ÀÇ Å©·¡½Ã ¿©ºÎ¿¡ »ó°ü¾øÀÌ ÆÄÀÏÀº ÀÚµ¿ÀûÀ¸·Î Áö¿öÁø´Ù. Áï°¢ÀûÀÎ unlinking °ú °ü·ÃµÈ ÇѰ¡Áö »ç¼ÒÇÑ ¹®Á¦´Â °ü¸®ÀÚ°¡ ´Ü¼øÈ÷ À̸§¸¸À¸·Î ÆÄÀϽýºÅÛÀ» Á¶»çÇÒ ¼ö ¾ø±â ¶§¹®¿¡ °ü¸®ÀÚ°¡ ¾ó¸¶³ª ¸¹Àº µð½ºÅ© °ø°£ÀÌ »ç¿ëµÇ°í ÀÖ´ÂÁö º¸´Â °ÍÀ» ¾î·Æ°Ô ÇÑ´Ù´Â °ÍÀÌ´Ù.
À¯´Ð½º °è¿ ½Ã½ºÅÛÀÇ ÄÚµå´Â TMP ¶Ç´Â TMPDIR ȯ°æº¯¼ö °ªµéÀÇ Á¦°øÀÚ°¡ ½Å·ÚµÈ´Ù¸é À̵éÀ» Ä§ÇØÇÏÁö ¾ÊÀ½À» º¸ÁõÇÏ´Â °ÍÀ» °í·ÁÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á »ç¿ëÀÚ°¡ ±×µéÀÇ Àӽà ÆÄÀÏÀ» ±×µéÀÇ È¨µð·ºÅ丮³» ÇϺεð·ºÅ丮¿Í °°Àº ºñ°øÀ¯µð·ºÅ丮·Î À̵¿ÇÏ´Â °ÍÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù. ÃÖ±Ù Bastille ¹öÀü¿¡¼´Â »ç¿ëÀڵ鰣ÀÇ °øÀ¯¸¦ Á¦ÇÑÇϱâ À§ÇØ ÀÌ·¯ÇÑ º¯¼öµéÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ºÒÇàÈ÷ ¸¹Àº »ç¿ëÀÚµéÀº TMP ¶Ç´Â TMPDIR À» /tmp ¿Í °°Àº °øÀ¯ µð·ºÅ丮·Î ¼³Á¤Çϴµ¥ µû¶ó¼ ÀÌ·¯ÇÑ È¯°æ º¯¼ö°¡ ¼³Á¤µÈ´Ù ÇÏ´õ¶óµµ º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥ÀÌ Á¤È®È÷ Àӽà ÆÄÀÏÀ» »ý¼ºÇØ¾ß ÇÑ´Ù. ÀÌ´Â GNOME Á¢±Ù ¹æ¹ýÀÇ ÀåÁ¡ ÁßÀÇ Çϳª·Î Àû¾îµµ ¾î¶² ½Ã½ºÅÛ¿¡¼ tempnam(3) ÀÌ ÀÚµ¿ÀûÀ¸·Î TMPDIR À» »ç¿ëÇÏ´Â ¹Ý¸é mkstemp(3) Á¢±Ù ¹æ¹ýÀº À̸¦ Çϱâ À§ÇØ ´õ¿í ¸¹Àº Äڵ带 ÇÊ¿ä·Î Çϱ⠶§¹®ÀÌ´Ù. Àӽà µð·ºÅ丮¸¦ À§ÇØ ´õ¿í ¸¹Àº ȯ°æ º¯¼öµé (TEMP ¿Í °°Àº) À» »ý¼ºÇÏÁö ¾Ê±â¸¦ ¹Ù¶ó¸ç ƯÈ÷ °¢°¢ÀÇ ¾ÖÇø®ÄÉÀ̼ǿ¡ ´ëÇØ ´Ù¸¥ ȯ°æ À̸§À» »ý¼ºÇÏÁö ¾Ê±â¸¦ ¹Ù¶õ´Ù (¿¹, MYAPP_TEMP ¸¦ »ç¿ëÇÏÁö ¸¶¶ó). ÀÌ·¸°Ô ÇÏ´Â °ÍÀº ½Ã½ºÅÛ °ü¸®¸¦ ±²ÀåÈ÷ º¹ÀâÇÏ°Ô Çϴµ¥ ƯÁ¤ ¾ÖÇø®ÄÉÀ̼ÇÀ» À§ÇØ Æ¯º° Àӽà µð·ºÅ丮¸¦ ¿øÇÏ´Â »ç¿ëÀÚ´Â ±× ¾ÖÇø®ÄÉÀ̼ÇÀ» ¿î¿ëÇÒ ¶§¿¡ ÇÑÇØ ȯ°æ º¯¼ö¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ÀÌ·¯ÇÑ È¯°æ º¯¼ö°¡ ½Å·ÚµÇÁö ¾ÊÀº ¼Ò½º¿¡ ÀÇÇØ ¼³Á¤µÈ´Ù¸é À̵éÀ» ¹«½ÃÇØ¾ß ÇÑ´Ù - 4.2.3Àý ÀÇ Ãæ°í¸¦ µû¸¥´Ù¸é ¾î¶² ¹æ½ÄÀ¸·Îµç ÇÒ ¼ö ÀÖ´Ù.
ÀÌ·¯ÇÑ ±â¹ýÀº Àӽà µð·ºÅ丮°¡ NFS ¹öÀü 2 (NFSv2) ¸¦ »ç¿ëÇØ¼ ¿ø°ÝÀûÀ¸·Î ¸¶¿îÆ®µÈ´Ù¸é ÀÛµ¿ÇÏÁö ¾Ê´Âµ¥ NFSv2 °¡ O_EXCL À» ÀûÀýÈ÷ Áö¿øÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ´õ¿í ÀÚ¼¼ÇÑ Á¤º¸´Â 6.8.2.1Àý À» º¸¶ó. NFS ¹öÀü 3 ÀÌ»óÀº O_EXCL À» ÀûÀýÈ÷ Áö¿øÇÑ´Ù; °£´ÜÇÑ ÇØ°á ¹æ¹ýÀº Àӽà µð·ºÅ丮°¡ ·ÎÄÃÀ̰ųª NFS ¸¦ »ç¿ëÇØ ¸¶¿îÆ®µÈ °æ¿ì NFS ¹öÀü 3 ÀÌ»óÀ» »ç¿ëÇØ¼ ¸¶¿îÆ®µÇ´Â Áö¸¦ º¸ÁõÇÏ´Â °ÍÀÌ´Ù. NFS v2 ¿¡¼ link(2) ¿Í stat(2) ¸¦ »ç¿ëÇÔÀ¸·Î½á ¾ÈÀüÇÏ°Ô Àӽà ÆÄÀÏÀ» »ý¼ºÇÏ´Â ±â¹ýÀÌ ÀÖÁö¸¸ º¹ÀâÇÏ´Ù; ÀÌ¿¡ ´ëÇØ ´õ¿í ÀÚ¼¼ÇÑ Á¤º¸´Â 6.8.2.1Àý À» º¸¶ó.
¿©´ãÀ¸·Î FreeBSD °¡ ÆÄÀÏÀ̸§ÀÇ PID ÄÄÆ÷³ÍÆ® Á¦°Å ¹× Àüü¸¦ base-62 ÀÎÄÚµå randomness ·Î ´ëüÇϱâ À§ÇØ mk*tem() °è¿ ÇÔ¼ö¸¦ ÃÖ±Ù¿¡ º¯°æÇßÀ½À» ¾ð±ÞÇÏ´Â °ÍÀº °¡Ä¡°¡ ÀÖ´Ù. ÀÌ´Â °ú°¨ÇÏ°Ô 6 X ÀÇ µðÆúÆ® »ç¿ë¹ý¿¡ ´ëÇØ °¡´ÉÇÑ Àӽà ÆÄÀÏÀÇ ¼ö¸¦ Áõ°¡½ÃŰ¸ç ¸Å¿ì ºó¹øÈ÷ »ç¿ëÇÏ´Â °æ¿ì¸¦ Á¦¿ÜÇϰí´Â 6 X ¸¦ °®´Â mktemp(3) °¡ ÃßÃø¿¡ ÇÕ¸®ÀûÀ¸·Î (Åë°èÀûÀ¸·Î) º¸¾ÈÀûÀÓÀ» ÀǹÌÇÑ´Ù. ±×·¯³ª ÀÌ ¹®¼ÀÇ ÁöħÀ» µû¸¥´Ù¸é ¹®Á¦¸¦ Á¦°ÅÇÒ ¼ö ÀÖ´Ù.
Àӽà ÆÄÀÏ¿¡ ´ëÇÑ ÀÌ Á¤º¸ÀÇ ¸¹Àº ºÎºÐÀº Kris Kennaway's posting to Bugtraq about temporary files on December 15, 2000 ¿¡¼ À¯·¡ÇÑ´Ù.
ÇÁ·Î±×·¥ÀÌ ÆÄÀÏ, µð¹ÙÀ̽º ¹×/¶Ç´Â Ưº°ÇÑ ¼¹ö ÇÁ·Î¼¼½º¿¡ ´ëÇØ À¯ÀÏÇÑ ±ÇÇÑÀ» °®À½À» º¸ÀåÇØ¾ßÇÏ´Â »óȲÀÌ Á¾Á¾ ÀÖ´Ù. ÀÚ¿øÀ» Àá±×´Â ¸ðµç ½Ã½ºÅÛÀº ÇÁ·Î±×·¥ÀÌ ·ÎÅ© (lock) ¸¦ Á¤¸®ÇÏÁö ¸øÇÑ´Ù¸é ·ÎÅ©, ´õ ÀÚ¼¼È÷ ¸»ÇÏ¸é ±³Âø »óÅ (deadlocks("deadly embraces")), livelocks ¿Í releasing "stuck" ·ÎÅ©µéÀÇ Ç¥ÁØÀûÀÎ ¹®Á¦¸¦ ´Ù·ï¾ß ÇÑ´Ù. ±³Âø »óÅ´ ÇÁ·Î±×·¥µéÀÌ ÀÚ¿øµéÀ» ÇØÁ¦Çϱâ À§ÇØ ¼·Î ±â´Ù¸®¸é¼ ±³ÂøµÇ¾î ÀÖ´Ù¸é ÀϾ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ±³Âø »óÅ´ ÇÁ·Î¼¼½º 1 ÀÌ ÀÚ¿ø A ¸¦ ·ÎÅ©Çϸç ÀÚ¿ø B ¸¦ ±â´Ù¸®´Â ¹Ý¸é ÇÁ·Î¼¼½º 2 ´Â ÀÚ¿ø B ¸¦ ·ÎÅ©Çϸç ÀÚ¿ø A ¸¦ ±â´Ù¸®°í ÀÖ´Ù¸é ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ¸¹Àº ±³Âø »óÅ´ ´ÙÁß ÀÚ¿øÀ» ·ÎÅ©ÇÏ´Â ¸ðµç ÇÁ·Î¼¼½ºµé¿¡°Ô ±×µéÀ» µ¿ÀÏÇÑ ¼ø¼ (¿¹, ¾ËÆÄºª À̸§¼øÀ¸·Î) ·Î ·ÎÅ©Çϵµ·Ï ¿ä±¸ÇÔÀ¸·Î½á ¿¹¹æµÉ ¼ö ÀÖ´Ù.
À¯´Ð½º °è¿ ½Ã½ºÅÛ¿¡¼ ÀÚ¿ø ·ÎÅ· (Àá±Ý, locking) Àº ÀüÅëÀûÀ¸·Î ·ÎÅ©¸¦ ÁöÁ¤ÇÏ´Â ÆÄÀÏÀ» »ý¼ºÇÔÀ¸·Î½á ÀüÅëÀûÀ¸·Î ÀÌ·ç¾îÁ³´Âµ¥ ÀÌ·¯ÇÑ ¹æ¹ýÀÌ ¸Å¿ì À̽ļºÀÌ ³ô±â ¶§¹®ÀÌ´Ù. ÀÌ´Â °ü¸®ÀÚ°¡ ¾î¶² ·ÎÅ©°¡ ¼³Á¤µÇ¾ú´ÂÁö º¸±â À§ÇØ ´ÜÁö ÆÄÀϽýºÅÛ¸¸ °Ë»çÇÏ¸é µÇ±â ¶§¹®¿¡ ±³ÂøµÈ ·ÎÅ©¸¦ Á¤¸®ÇÏ´Â °ÍÀ» ½±°Ô ÇÑ´Ù. ±³ÂøµÈ ·ÎÅ©´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇà ÈÄ Á¤¸®Çϴµ¥ ½ÇÆÐÇϰųª (¿¹, Å©·¡½Ã ¶Ç´Â ¿À±â´É (malfunctioned)) Àüü ½Ã½ºÅÛÀÌ Á¤ÁöÇ߱⠶§¹®¿¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. À̵éÀÌ ±Ç°í (advisory) ·ÎÅ© (°Á¦ (mandatory) ·ÎÅ©°¡ ¾Æ´Ñ) ÀÓÀ» ÁÖ¸ñÇØ¶ó - ¸ðµç ÇÁ·Î¼¼½º´Â ÀÚ¿øÀÌ ÀÌ·¯ÇÑ ·ÎÅ©¸¦ »ç¿ëÇϱâ À§ÇØ Çù·ÂÇØ¾ß ÇÔÀ» ÇÊ¿ä·ÎÇÑ´Ù.
±×·¯³ª ÇÇÇÒ ¼ö ÀÖ´Â ¸î¸î ¼ÓÀÓ¼ö°¡ ÀÖ´Ù. ù¹øÂ° creat() ÇÔ¼ö È£Ãâ ¶Ç´Â ÆÄÀÏ ¸ðµå¸¦ 0 À¸·Î ¼³Á¤Çϰí (Çã°¡±Ç ¾øÀ½) O_WRONLY | O_CREAT | O_TRUNC open() ¸ðµåÀÎ open() µî°¡ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â À¯´Ð½º C ÇÁ·Î±×·¥ÀÇ ¸Å¿ì ¿À·¡µÈ ±â¹ýÀ» »ç¿ëÇÏÁö ¸¶¶ó. ÀϹÝÀûÀÎ ÆÄÀϽýºÅÛ¿¡¼ ÀÏ¹Ý »ç¿ëÀÚ¿¡°Ô ÀÌ´Â ÀÛµ¿ÇÏÁö¸¸ »ç¿ëÀÚ°¡ ·çÆ® ±ÇÇÑÀ» °¡Áú ¶§ ÆÄÀÏÀ» ·ÎÅ©ÇÒ ¼ö ¾ø´Ù. ·çÆ®´Â ÆÄÀÏÀÌ ÀÌ¹Ì Á¸ÀçÇÒ ¶§¶óµµ ´Ã ÀÌ ¿¬»êÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù. »ç½Ç ¿À·¡µÈ À¯´Ð½º ¹öÀüµéÀº ¿À·¡µÈ ¿¡µðÅÍ "ed" ¿¡ ÀÌ·¯ÇÑ Æ¯º°ÇÑ ¹®Á¦¸¦ °®°í ÀÖ´Ù -- Áõ»óÀº ¶§¶§·Î ÆÐ½º¿öµå ÆÄÀÏÀÇ ÀϺκÐÀÌ »ç¿ëÀÚ ÆÄÀϳ»¿¡ ³õÀÏ ¼ö ÀÖ´Â °ÍÀÌ´Ù [Rochkind 1985, 22]. ´ë½Å Áö¿ªÀû ÆÄÀϽýºÅÛ¿¡¼ ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ·ÎÅ©¸¦ »ý¼ºÇÏ·Á¸é O_WRONLY | O_CREAT | O_EXCL Ç÷¡±×¸¦ °®°í open() À» »ç¿ëÇÒ ¼ö ÀÖ´Ù (µ¿ÀÏÇÑ ¼ÒÀ¯ÀÚÀÇ ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ ·ÎÅ©¸¦ ÇÒ ¼ö ¾øµµ·Ï Çã°¡±ÇÀº ¾ø´Ù). µ¶Á¡ÀûÀÎ ÆÄÀÏÀ» »ý¼ºÇÏ´Â °ø½ÄÀûÀÎ ¹æ½ÄÀÎ O_EXCL ÀÇ »ç¿ëÀ» ÁÖ¸ñÇØ¶ó; ÀÌ´Â ·ÎÄà ÆÄÀϽýºÅÛ¿¡¼ ·çÆ®¿¡ ´ëÇØ¼µµ ÀÛ¿ëÇÑ´Ù [Rochkind 1985, 27].
µÎ¹øÂ° ·ÎÅ© ÆÄÀÏÀÌ NFS ·Î ¸¶¿îÆ®µÈ ÆÄÀϽýºÅÛ¿¡ ÀÖ´Ù¸é NFS ¹öÀü 2 °¡ ÀÏ¹Ý ÆÄÀÏ ÀÇ¹Ì Ã¼°è¸¦ ¿Ïº®È÷ Áö¿øÇÏÁö ¾Ê´Â´Ù´Â ¹®Á¦¸¦ °®´Â´Ù. À̴ Ŭ¶óÀÌ¾ðÆ®¿¡ ·ÎÄÃÀ̶ó°í °£ÁֵǴ ÀÛ¾÷¿¡ ´ëÇØ¼µµ ¹®Á¦°¡ µÇ´Âµ¥ ¾î¶² Ŭ¶óÀÌ¾ðÆ®°¡ ·ÎÄà µð½ºÅ©¸¦ °®Áö ¸øÇÏ°í ¸ðµç ÆÄÀÏÀÌ NFS ¸¦ ÅëÇØ ¿ø°ÝÀûÀ¸·Î ¸¶¿îÆ®µÉ ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. open(2) ¸Þ´º¾óÀº ÀÌ·± °æ¿ì ó¸® ¹æ¹ýÀ» ¼³¸íÇÑ´Ù (·çÆ® ÇÁ·Î±×·¥ÀÇ °æ¿ìµµ ¶ÇÇÑ ´Ù·é´Ù):
""·ÎÅ· ŽºÅ©¸¦ ¼öÇàÇϱâ À§ÇØ [open(2) ÀÇ O_CREAT ¿Í O_EXCL Ç÷¡±×] ¿¡ ÀÇÁ¸ÇÏ´Â ÇÁ·Î±×·¥µéÀº °æÀï »óŸ¦ Æ÷ÇÔÇÒ °ÍÀÌ´Ù. ·ÎÅ©ÆÄÀÏÀ» »ç¿ëÇØ¼ ¿øÀÚÀû ÆÄÀÏ ·ÎÅ·À» ¼öÇàÇϱâ À§ÇÑ ÇØ°á ¹æ¾ÈÀº µ¿ÀÏ ÆÄÀϽýºÅÛ¿¡¼ À¯ÀÏÇÑ ÆÄÀÏÀ» »ý¼ºÇϰí (¿¹, È£½ºÆ®³×ÀÓ°ú pid ¸¦ º´ÇÕ), ·ÎÅ©ÆÄÀÏ¿¡ ´ëÇÑ ¸µÅ©¸¦ ¸¸µé±â À§ÇØ link(2) ¸¦ »ç¿ëÇÑ ÈÄ ±× ¸µÅ© Ä«¿îÆ®°¡ 2 ·Î Áõ°¡µÇ¾ú´ÂÁö °Ë»çÇϱâ À§ÇØ À¯ÀÏÇÑ ÆÄÀÏ¿¡ stat(2) ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. link(2) È£ÃâÀÇ ¹Ýȯ°ªÀ» »ç¿ëÇÏÁö ¸¶¶ó" "
¸í¹éÈ÷ ÀÌ ÇØ°á¹æ¾ÈÀº ·ÎÅ·À» ÇÏ´Â ¸ðµç ÇÁ·Î±×·¥ÀÌ Çùµ¿ÇÏ°í ¸ðµç Çùµ¿ÇÏÁö ¾Ê´Â ÇÁ·Î±×·¥µéÀÇ °£¼·ÀÌ Çã¿ëµÇÁö ¾Ê´Â °æ¿ì¿¡¸¸ ÀÛ¿ëÇÑ´Ù. ƯÈ÷ ÆÄÀÏ ·ÎÅ·À» À§ÇØ »ç¿ëÇϰí ÀÖ´Â µð·ºÅ丮´Â ÆÄÀÏ »ý¼º ¹× Á¦°Å¸¦ À§ÇÑ Çã¿ëµÈ ÆÄÀÏ Çã°¡±ÇÀ» °¡Á®¼´Â ¾ÈµÈ´Ù.
NFS ¹öÀü 3 Àº open(2) ¿¡ O_EXCL ¸ðµå¿¡ ´ëÇÑ Áö¿øÀÌ Ãß°¡ÇÏ¿´´Ù; IEFT RFC 1813 À» º¸¶ó ƯÈ÷ "CREATE" ÀÇ "mode" Àμö¿¡ ´ëÇÑ "EXCLUSIVE" °ªÀ» º¸¶ó. ½½ÇÁ°Ôµµ ¸ðµç »ç¶÷ÀÌ ÀÌ ¹®¼¸¦ ÀÛ¼ºÇÏ´Â ½ÃÁ¡¿¡ NFS ¹öÀü 3 ÀÌ»óÀ¸·Î ÀüȯÇÏÁö ¾Ê¾ÒÀ¸¸ç µû¶ó¼ À̽ļºÀÖ´Â ÇÁ·Î±×·¥¿¡¼´Â ¾ÆÁ÷±îÁö ÀÌ¿¡ ÀÇÁ¸ÇÒ ¼ö ¾ø´Ù. °á±¹Àº ÀÌ ¹®Á¦´Â ¾ø¾îÁú °ÍÀÌ´Ù.
µð¹ÙÀ̽º ¶Ç´Â ·ÎÄà ¸Ó½Å¿¡¼ ÇÁ·Î¼¼½ºÀÇ Á¸À縦 ·ÎÅ·ÇÏ·Á¸é Ç¥ÁØÀûÀÎ ÇÕÀǸ¦ »ç¿ëÇϵµ·Ï ÇØ¶ó. ÀúÀÚ´Â FHS ¸¦ »ç¿ëÇϱ⸦ ÃßõÇÑ´Ù; ÀÌ´Â ¸®´ª½º ½Ã½ºÅÛ¿¡ ÀÇÇØ ³Î¸® ÂüÁ¶µÇ°í ÀÖÀ¸¸ç ¶ÇÇÑ ´Ù¸¥ À¯´Ð½º °è¿ ½Ã½ºÅÛÀÇ °³³äÀ» º´ÇÕÇÏ·Á°í Çϰí ÀÖ´Ù. FHS ´Â ÆÄÀϵ鿡 ´ëÇÑ ÆÄÀÏ ³×À̹Ö, À§Ä¡ ¹× Ç¥ÁØ ÄÁÅÙÃ÷¸¦ Æ÷ÇÔÇØ¼ ÆÄÀÏ ·ÎÅ· µî¿¡ ´ëÇØ Ç¥ÁØÀûÀÎ ÇÕÀǸ¦ ±â¼úÇÑ´Ù [FHS 1997]. ¼¹ö°¡ ÁÖ¾îÁø ¸Ó½Å¿¡¼ Çѹø ÀÌ»ó ½ÇÇàµÇÁö ¾Ê¾ÒÀ½À» È®ÀÎÇÏ·Á ÇÑ´Ù¸é º¸Åë ÄÁÅÙÃ÷¿Í °°ÀÌ pid ¸¦ °®´Â /var/run/NAME.pid ÇÁ·Î¼¼½º ½Äº°ÀÚ¸¦ »ý¼ºÇØ¾ß ÇÑ´Ù. µ¿ÀÏ ¸Æ¶ôÀ¸·Î µð¹ÙÀ̽º ·ÎÅ© ÆÄÀÏ µîÀ» À§ÇØ ·ÎÅ© ÆÄÀÏÀ» /var/lock ¹Ø¿¡ ³õ¾Æ¾ß ÇÑ´Ù. ÀÌ Á¢±Ù ¹æ¹ýÀº ÇÁ·Î±×·¥ÀÌ °©ÀÚ±â Á¤ÁöÇÏ´Â °æ¿ì ÆÄÀϵéÀÌ ¾µµ¥¾øÀÌ ½Ã°£À» º¸³»°Ô ÇÏ´Â ´ÜÁ¡ÀÌ ÀÖÁö¸¸ À̴ ǥÁØÀûÀÎ ÇÕÀÇ·Î ´Ù¸¥ ½Ã½ºÅÛ µµ±¸¿¡ ÀÇÇØ ½±°Ô ´Ù·ïÁø´Ù.
·ÎÅ©¸¦ ³ªÅ¸³»±â À§ÇØ ÆÄÀÏ »ç¿ë¿¡ Çùµ¿Çϰí ÀÖ´Â ÇÁ·Î±×·¥µéÀº µ¿ÀÏÇÑ µð·ºÅ丮 À̸§¸¸ÀÌ ¾Æ´Ï¶ó µ¿ÀÏÇÑ µð·ºÅ丮¸¦ »ç¿ëÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. ÀÌ´Â ³×Æ®¿öÅ©ÈµÈ ½Ã½ºÅÛ¿¡ °ü·ÃµÈ ¹®Á¦ÀÌ´Ù. FHS ´Â ¸í½ÃÀûÀ¸·Î /var/run °ú /var/lock ´Â °øÀ¯ÇÒ ¼ö ¾ø´Â ¹Ý¸é /var/mail Àº °øÀ¯ÇÒ ¼ö ÀÖ´Ù°í ¾ð±ÞÇÑ´Ù. µû¶ó¼ ÇϳªÀÇ ¸Ó½Å¿¡¼ ·ÎÅ©°¡ ÀÛµ¿ÇÏ±æ ¿øÇÏÁö¸¸ ´Ù¸¥ ¸Ó½ÅÀ» °£¼·ÇÏÁö ¾Ê±æ ¿øÇÑ´Ù¸é /var/run °ú °°Àº °øÀ¯ÇÒ ¼ö ¾ø´Â µð·ºÅ丮¸¦ »ç¿ëÇØ¶ó (¿¹, °¢ ¸Ó½Å¿¡°Ô ÀÚ½ÅÀÇ ¼¹ö¸¦ ±¸µ¿Çϵµ·Ï Çã¿ëÇÏ±æ ¿øÇÏ´Â °æ¿ì). ±×·¯³ª ³×Æ®¿öÅ©¿¡¼ ÆÄÀÏÀ» °øÀ¯ÇÏ´Â ¸ðµç ¸Ó½ÅµéÀÌ ·ÎÅ©¸¦ µû¸£±æ ¿øÇÑ´Ù¸é °øÀ¯Çϰí ÀÖ´Â µð·ºÅ丮¸¦ »ç¿ëÇÒ Çʿ䰡 ÀÖ´Ù; /var/mail ÀÌ ÀÌ·¯ÇÑ À§Ä¡ÀÌ´Ù. ÀÌ ÁÖÁ¦¿¡ ´ëÇØ ´õ¿í ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾ò±â À§Çؼ´Â FHS ÀýÀ» º¸¶ó.
¹°·Ð ·ÎÅ©¸¦ ³ªÅ¸³»±â À§ÇØ ÆÄÀÏÀ» »ç¿ëÇÒ ÇÊ¿ä´Â ¾ø´Ù. ³×Æ®¿öÅ© ¼¹öµéÀº ´ë°³ ½Å°æ¾µ Çʿ䰡 ¾ø´Ù: ´ÜÁö Æ÷Æ®¿¡ ¹ÙÀεùÇÑ´Ù´Â °Í¸¸ÀÌ ÀÏÁ¾ÀÇ ·ÎÅ©·Î¼ ÀÛ¿ëÇϴµ¥ ÁÖ¾îÁø Æ÷Æ®¿¡ ¹Ù¿îµåµÈ ±âÁ¸ ¼¹ö°¡ ÀÖ´Ù¸é ¾î¶°ÇÑ ´Ù¸¥ ¼¹öµµ ÀÌ Æ÷Æ®¿¡ ¹ÙÀεù ÇÒ ¼ö ¾ø±â ¶§¹®ÀδÙ.
·ÎÅ·¿¡ ´ëÇÑ ´Ù¸¥ Á¢±Ù ¹æ¹ýÀº "discretionary lock" ·Î¼ fcntl(2) ¸¦ ÅëÇØ ±¸ÇöµÈ POSIX ·¹ÄÚµå ·ÎÅ©¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ´Â ÀÓÀÇ·Î, Áï À̸¦ »ç¿ëÇÏ´Â °ÍÀº ·ÎÅ©¸¦ ÇÊ¿ä·Î ÇÏ´Â ÇÁ·Î±×·¥µéÀÇ Çùµ¿À» ÇÊ¿ä·Î ÇÑ´Ù ( ·ÎÅ©¸¦ ³ªÅ¸³»±â À§ÇØ ÆÄÀÏÀ» »ç¿ëÇÏ´Â Á¢±Ù¹æ¹ý°ú ¸¶Âù°¡Áö·Î). POSIX ·¹ÄÚµå ·ÎÅ©¸¦ ÃßõÇÏ´Â ¸¹Àº ÀÌÀ¯°¡ ÀÖ´Ù: POSIX ·¹ÄÚµå ·ÎÅ·Àº °ÅÀÇ ¸ðµç À¯´Ð½º °è¿ Ç÷§Æû (POSIX 1 ¿¡ ÀÇÇØ °Á¦ÀûÀ¸·Î ¿ä±¸µÇ´Â) ¿¡¼ Áö¿øµÇ¸ç, Àüü ÆÄÀϸ¸ÀÌ ¾Æ´Ñ ÆÄÀÏÀÇ ÀϺκÐÀ» ·ÎÅ©ÇÒ ¼ö ÀÖÀ¸¸ç ¶ÇÇÑ Àбâ¿Í ¾²±â ·ÎÅ©°£ÀÇ Â÷À̸¦ ´Ù·ê ¼ö ÀÖ´Ù. ´õ¿í À¯¿ëÇÑ °ÍÀº ÇÁ·Î¼¼½º°¡ ¼Ò¸êÇϸé ÀÌ ÇÁ·Î¼¼½ºÀÇ ·ÎÅ©µµ ÀÚµ¿ÀûÀ¸·Î Á¦°ÅµÈ´Ù´Â °ÍÀ¸·Î ÀÌ´Â º¸Åë ¿øÇÏ´Â »çÇ×ÀÌ´Ù.
System V ÀÇ mandatory ·ÎÅ· ½ºÅ´¿¡ ±âÃÊÇÑ °Á¦ ·ÎÅ©µµ ¶ÇÇÑ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ´ÜÁö ·ÎÅ©µÈ ÆÄÀÏÀÇ setgid ºñÆ®°¡ ¼³Á¤µÇ¾î ÀÖÁö¸¸ ±×·ìÀÇ ½ÇÇà ºñÆ®°¡ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀº ÆÄÀϸ¸¿¡ Àû¿ëµÈ´Ù. ¶ÇÇÑ °Á¦ ÆÄÀÏ ·ÎÅ©¸¦ Çã¿ëÇϱâ À§ÇØ ÆÄÀϽýºÅÛÀ» ¸¶¿îÆ®ÇØ¾ß ÇÑ´Ù. ÀÌ·± °æ¿ì ¸ðµç read(2) ¿Í write(2) ´Â ·ÎÅ·À» À§ÇØ °Ë»çµÈ´Ù; ÀÌ´Â ±Ç°í ·ÎÅ©º¸´Ù ´õ¿í öÀúÇÏÁö¸¸ ´õ¿í ´À¸®´Ù. ¶ÇÇÑ °Á¦ ·ÎÅ©´Â ´Ù¸¥ À¯´Ð½º °è¿ ½Ã½ºÅÛÀ¸·Î ³Î¸® À̽ĵÇÁö´Â ¾Ê´Â´Ù (¸®´ª½º¿Í System V ¿¡ ±âÃÊÇÑ ½Ã½ºÅÛ¿¡¼´Â »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ ´Ù¸¥ ½Ã½ºÅÛ¿¡¼´Â ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï´Ù). ·çÆ® ±ÇÇÑÀ» °®´Â ÇÁ·Î¼¼½º´Â °Á¦ ·ÎÅ©¿¡ ÀÇÇØ ¶ÇÇÑ Á¤ÁöµÉ ¼ö ÀÖÀ½À» ÁÖ¸ñÇØ¶ó. ÀÌ´Â ¼ºñ½º ºÎÀÎ °ø°ÝÀÇ ±âÃʰ¡ µÉ ¼ö ÀÖ°Ô²û ÇÑ´Ù.