ÆÄÀÏÀá±×±â¿Í °ü·ÃµÈ À̾߱âµé
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>file_lock



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
¸¸µç³¯ 2003/12/16 http://www.joinc.co.kr/images/myavata/2.gif
°ü¸®ÀÚ yundream
ȨÆäÀÌÁö http://www.joinc.co.kr
À̸ÞÀÏ Myundream_at_joinc.co.kr

¸ñÂ÷

Contents

1 ±³Á¤ °úÁ¤
2 ÆÄÀÏÀá±×±â
2.1 ÆÄÀÏÀá±ÝÀÇ Çʿ伺
2.2 À¯´Ð½º¿¡¼­ Á¦°øÇÏ´Â ÆÄÀÏ Àá±Ý µµ±¸
2.2.1 flock(2)
2.2.2 fcntl(2)
2.3 °æÀï»óÅ ¹®Á¦¿¡ ´ëÇØ¼­
2.3.1 Ä¿³Î ¾÷±×·¹À̵å
2.3.2 O_APPEND ¸ðµå·Î ¿­±â
2.3.3 ¼¼¸¶Æ÷¾î ÀÀ¿ë
3 Åä·Ð¹× Àâ´ã
4 Âü°í¹®Çå


1 ±³Á¤ °úÁ¤

  1. 2003/12/16 À§Å° »ý¼º - yundream

2 ÆÄÀÏÀá±×±â

2.1 ÆÄÀÏÀá±ÝÀÇ Çʿ伺

ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ÆÄÀÏÀ» ¿­¾î¼­ ÀÛ¾÷ÇÏ´Â °æ¿ì¶ó¸é °ü°è¾ø°ÚÁö¸¸ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º³ª ¾²·¹µå°¡ ÇϳªÀÇ ÆÄÀÏÀ» ¿­¾î¼­ ÀÛ¾÷ÇÒ °æ¿ì ´ÙÀ½°ú °°Àº ¹®Á¦°¡ ¹ß»ýÇÒ °ÍÀ» ¿¹»óÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
  1. ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ÆÄÀÏÀ» ¾²°í Àִµ¥ ¾²±â°¡ ¿ÏÀüÈ÷ ³¡³ªÁö ¾ÊÀº »óÅ¿¡¼­ ´Ù¸¥ ÇÁ·Î¼¼½ºµµ ÆÄÀÏ¿¡ ½á¹ö¸°´Ù. µ¥ÀÌÅͰ¡ µÚÁ×¹ÚÁ× µÇ¾î ¹ö¸± °ÍÀÌ´Ù.
  2. µÑ´Ù µ¿½Ã¿¡ ÆÄÀÏÀÇ ³»¿ëÀ» ÀÐ°í ±× ³»¿ëÀ» ¼öÁ¤ÇÔÀ¸·Î½á ¹ß»ýÇÏ´Â µ¿½Ã¼º ¹®Á¦, °¡Àå °£´ÜÇÑ ¿¹·Î Ä«¿îÆ®¸¦ ´Ã¸®´Â ÇÁ·Î±×·¥À» »ý°¢ÇÒ ¼ö ÀÖ´Ù. ÆÄÀÏÀÇ Ä«¿îÆ®°¡ 1000ÀÌ°í µÎ°³ÀÇ ÇÁ·Î¼¼½º°¡ Ä«¿îÆ®¸¦ Áõ°¡ ½ÃŰ·Á°í Çϴµ¥ °ÅÀÇ µ¿½Ã¿¡ Àо µÑ´Ù 1000À» Àоú´Ù¸é Ä«¿îÆ®´Â 1001ÀÌ µÉ°ÍÀÌ´Ù. ±×·¯³ª ¿øÇÏ´Â °ªÀº 1002°¡ µÇ¾î¾ß ÇÑ´Ù.

ÀÌ·± ¹®Á¦´Â ƯÈ÷ ´ÙÁß ÇÁ·Î¼¼½º±â¹ÝÀ¸·Î ÀÛµ¿ÇÏ´Â À¥¼­¹ö»ó¿¡¼­ÀÇ ÇÁ·Î±×·¡¹Ö½Ã ÀÚÁÖ ¹ß»ýÇÏ´Â ¹®Á¦´Ù. À¯Àú·Î±×¸¦ ÆÄÀÏ·Î ³²±ä´Ù°í ÇßÀ» ¶§ ÆÄÀÏ¿¡ µ¿½Ã¿¡ ¿©·¯¸íÀÌ Á¢±ÙÇØ¼­ ¾²°Ô µÇ¸é ºÐ¸í µ¥ÀÌÅͰ¡ ²¿ÀÌ´Â ¹®Á¦°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù.

ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇÑ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº µ¿½Ã¿¡ ¿ÀÁ÷ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ÀÌ ÆÄÀÏ¿¡ Á¢±ÙÇϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ÇÁ·Î¼¼½º´Â ÆÄÀÏ¿¡ Á¢±ÙÇϱ⿡ Àá±×°í ¸ðµç ÀÏÀÌ ³¡³µÀ» ¶§ Àá±ÝÀ» Ç®µµ·Ï ÇÑ´Ù.

¶ÇÇÑ ´ýÀ¸·Î Àá±ÝÀ» À§ÇÑ Á¢±ÙÁ¦¾î¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â °æÀï»óÅÂ(race condition)¹®Á¦¿¡ ´ëÇØ¼­µµ °£´ÜÈ÷ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

2.2 À¯´Ð½º¿¡¼­ Á¦°øÇÏ´Â ÆÄÀÏ Àá±Ý µµ±¸

2.2.1 flock(2)

flockÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.
#include <sys/file.h>
int flock(int fd, int operation)

ÀÌ ÇÔ¼ö´Â ¿­·ÁÁø ÆÄÀÏ¿¡ ´ëÇØ¼­ ±Ç°íÀá±ÝÀ» Àû¿ëÇϰųª Á¦°ÅÇÏ´Â ÀÏÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù. ±Ç°íÀá±ÝÀ̶õ ¸»¿¡ À¯ÀÇÇØ¾ß ÇÑ´Ù. À̰ÍÀº ÆÄÀÏ¿¡ Á¢±ÙÇÏ·Á´Â ÇÁ·Î¼¼½ºµéÀÌ flock¸¦ »ç¿ëÇØ¼­ Àá±ÝÀ» °Ë»çÇϵµ·Ï ¼­·Î ¾à¼ÓµÇ¾î ÀÖ¾î¾ß Àá±ÝÀ» º¸ÀåÇÒ ¼ö ÀÖÀ½À» ¶æÇÑ´Ù. ¾î¶² ÆÄÀÏÀº flock¸¦ »ç¿ëÇØ¼­ Àá±ÝÀ» °Ë»çÇÏ°í ¾î¶² ÆÄÀÏÀº °Ë»çÇÏÁö ¾Ê´Â´Ù¸é Àá±ÝÀ» Çϳª ¸¶³ª°¡ µÈ´Ù.

ù¹øÂ° ÀÎÀÚÀÎ fd´Â Àá±ÝÀ» Àû¿ëȤÀº ÇØÁ¦ÇÏ±æ ¿øÇÏ´Â ¿­·ÁÁø ÆÄÀÏ ÁöÁ¤ÀÚ ÀÌ´Ù.

µÎ¹øÂ° ÀÎÀÚ´Â fd¿¡ ´ëÇØ¼­ ÇàÇØ Áö´Â ¿¬»êÀ¸·Î ´ÙÀ½°ú °°Àº Á¾·ù°¡ ÀÖ´Ù.
  1. LOCK_SH °øÀ¯ Àá±Ý. À¸·Î ÇѰ³ ÀÌ»óÀÇ ÇÁ·Î¼¼½ºµéÀÌ ÆÄÀÏ¿¡ ´ëÇÑ °øÀ¯Àá±ÝÀÌ °¡´ÉÇÏ°Ô ÇÑ´Ù.
  2. LOCK_EX ¹èŸ(exclusive)Àá±ÝÀ¸·Î Çѹø¿¡ ÇϳªÀÇ ÆÄÀϸ¸ÀÌ Àá±ÝÀ» ¾òÀ» ¼ö ÀÖ´Ù.
  3. LOCK_UN Àá±ÝÀ» Ǭ´Ù.
  4. LOCK_NB Àá±ÝÀÏ ¶§ ºí·°ÇÏÁö ¾Ê°í ¸®ÅÏÇÑ´Ù. Àá°ÜÀÖÀ½À» È®ÀÎÇÏ°í ´Ù¸¥ ÀÏÀ» ÇÒ ¶§ À¯¿ëÇÏ´Ù. ÀÌ ¿¬»êÀº ´Ù¸¥ ¿¬»êµé°ú |¿¬»êÀÌ °¡´ÉÇÏ´Ù. ¸¸¾à ÆÄÀÏÀÌ Àá°ÜÀÖ°Ô µÇ¸é errno¿¡ EWOULBLOCK°¡ ¼³Á¤µÈ´Ù.

flock¸¦ ÀÌ¿ëÇØ¼­ ÇÑ ÆÄÀÏ¿¡ ´ëÇØ¼­ °øÀ¯ Àá±Ý°ú ¹èŸ Àá±ÝÀ» µ¿½Ã¿¡ ÇÒ ¼ö´Â ¾ø´Ù. ÆÄÀÏÀá±ÝÀº inode¿¡ ´ëÇØ¼­ ÀÌ·ç¾î Áö°Ô µÇ¹Ç·Î dup¿Í fork´Â Áߺ¹µÈ Àá±ÝÀ» ¸¸µéÁö ¾Ê´Â´Ù. Áï dup¿Í fork¸¦ ÅëÇØ¼­ »õ·Î¿î ÇÁ·Î¼¼½º°¡ ¸¸µé¾îÁö°í °Å±â¿¡ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ °øÀ¯ÇÏ°Ô µÇ¸é ÇϳªÀÇ Àá±ÝÀ» °øÀ¯ÇÏ°Ô µÈ´Ù.
´ÙÀ½Àº °£´ÜÇÑ flockÀ» ÀÌ¿ëÇÑ ÆÄÀÏÀá±Ý Å×½ºÆ® ÄÚµå´Ù.
#include <unistd.h>
#include <stdlib.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char **argv )
{
    int fd;
        int id;
    int i;
    char *file_name = "lock.file";

        id = atoi(argv[1]);
    fd = open(file_name, O_RDONLY);
    if (flock(fd, LOCK_EX) != 0)
    {
        printf("flock error\n");
        exit(0);
    }

    for (i = 0; i < 5; i++)
    {
        printf("file lock %d : %d\n", id, i);
        sleep(1);
    }
        if (flock(fd, LOCK_UN) != 0)
        {
                printf("filue un lock error\n");
        }
    close(fd);
}

À§ÀÇ Äڵ带 ÄÄÆÄÀÏ ÇÑ ÈÄ 2°³ ÀÌ»ó ¶ç¿ö¼­ Å×½ºÆ® ÇØº¸¸é Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ Àá±ÝÀ» ¾òÀ» ¼ö ÀÖ°í ³ª¸ÓÁö ÇÁ·Î¼¼½ºµéÀº Àá±ÝÀ» ¾òÀ» ¶§±îÁö ±â´Ù¸®´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

ÀÚ ±×·³ Àç¹ÌÀÖ´Â? Å×½ºÆ®¸¦ Çѹø ÇØº¸µµ·Ï ÇÏÀÚ. À§ÀÇ ÄÄÆÄÀÏµÈ Äڵ带 °¢°¢ ´Ù¸¥ id¸¦ Á༭ Çѹø¿¡ ½ÇÇà½ÃŰ¸é °ú¿¬ ¾î¶² ¼ø¼­·Î Àá±ÝÀ» ¾ò°Ô µÉ±î? ½ÇÇàµÈ ¼ø¼­´ë·Î Àá±ÝÀ» ¾ò°Ô µÉÁö ¾Æ´ÒÁö ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
# ./flock 1& ./flock 2& ./flock 3& ./flock 4& ./flock 5& ./flock 6 
... 
OK File FD 1 : 0 
OK File FD 1 : 1 
OK File FD 1 : 2 
OK File FD 1 : 3 
OK File FD 1 : 4 
OK File FD 4 : 0 
OK File FD 4 : 1 
OK File FD 4 : 2 
OK File FD 4 : 3 
OK File FD 4 : 4 
OK File FD 2 : 0 
OK File FD 2 : 1 
OK File FD 2 : 2 
 
°¡´ÉÇÏ´Ù¸é Å͹̳Π2°³¿¡¼­ ÇѲ¨¹ø¿¡ Å×½ºÆ® ÇØº¸µµ·Ï ÇÑ´Ù.

Å×½ºÆ® ÇØº¸¸é ¾î´À ÇÁ·Î¼¼½º°¡ ¸ÕÀú Àá±ÝÀ» ¾ò°Ô µÇ´ÂÁö´Â ¼øÀüÈ÷ ¿î¿¡ Á¿ìµÊÀ» ¾Ë¼ö ÀÖ´Ù. À̰ÍÀº ÇÁ·Î¼¼½ºµéÀÌ °æÀïÀûÀ¸·Î Àá±ÝÀ» ¾òÀ»·Á°íÇÏ´Â °æÀï»óÅÂ(race condition) ¿¡ ³õÀÌ°Ô µÇ°í ¿îÀÌ ³ª»Ú¸é »ó´çÈ÷ ¿À·£½Ã°£ ȤÀº ¿µ¿øÈ÷ Àá±ÝÀ» ¾òÁö ¸øÇÏ°í ºí·°µÉ ¼öµµ ÀÖÀ½À» ÀǹÌÇÑ´Ù. °æ¿ì¿¡ µû¶ó¼­´Â »ó´çÈ÷ ½É°¢ÇÏ°Ô »ý°¢ÇØ¾ßµÉ ¹®Á¦´Ù.

ÀÌ ¹®Á¦¿¡ ´ëÇÑ ÇØ°á ¹æ¾ÈÀº ´Ù¸¥ Àå¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ.

À̿ܿ¡µµ NFS¿¡¼­ÀÇ °æ¿ì »ç¿ëÇÒ ¼ö ¾ø´Ù´Â ´ÜÁ¡À» °¡Áö°í ÀÖ´Ù. À̹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â ´ÙÀ½¿¡¼­ ¼³¸íÇÒ fcntlÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.

2.2.2 fcntl(2)

fcntlÀº ÆÄÀÏ(file)À» Á¦¾î(control)Çϱâ À§Çؼ­ »ç¿ëµÇ´Â ½Ã½ºÅÛ ÇÔ¼ö·Î ÆÄÀÏ Àá±×±â´Â fcntlÀÌ Á¦°øÇÏ´Â ¿©·¯°¡Áö Á¦¾î ±â´ÉÁß ÀϺκÐÀÌ´Ù. fcntlÀ» ÀÌ¿ëÇÒ °æ¿ì ÆÄÀÏ ´ÜÀ§»Ó¸¸ ¾Æ´Ï¶ó ·¹ÄÚµå ´ÜÀ§·Îµµ Àá±ÝÀÌ °¡´ÉÇѵ¥, ÀÌ¿¡ ³»¿ëÀº ÀÌ¹Ì [http]fcntlÀ» ÀÌ¿ëÇÑ ·¹ÄÚµå Àá±Ý¿¡¼­ ´Ù·ç°í ÀÖÀ¸¹Ç·Î ¿©±â¿¡¼­´Â °³·«ÀûÀ¸·Î¸¸ ¼³¸í Çϵµ·Ï ÇϰڴÙ.

±âº»ÀûÀ¸·Î fcntlÀº ÆÄÀÏ´ÜÀ§°¡ ¾Æ´Ñ ·¹ÄÚµå ´ÜÀ§·ÎÀÇ Àá±ÝÀ» Á¦°øÇÏÁö¸¸ ¾îÂ÷ÇÇ ¸í½ÃÀûÀ¸·Î ÀÌ·ç¾îÁö´Â Àá±ÝÀ̹ǷΠÆÄÀÏ Àá±Ý¿ëÀ¸·Îµµ È®Àå ½ÃÄѼ­ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº fcntlÀ» ÀÌ¿ëÇÑ ÆÄÀÏ Àá±Ý ¿¹Á¦´Ù. flockÀÇ fcntl¹öÁ¯À̶ó°í º¸¸é µÈ´Ù.

#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

// ÆÄÀÏÀÌ Àá°Ü ÀÖ´ÂÁö È®ÀÎÇØ¼­ Àá±ÝÀ» ¾ò°í 
// Àá°Ü ÀÖÀ» °æ¿ì Àá±ÝÀÌ Ç®¸± ¶§±îÁö 
// ±â´Ù¸°´Ù.  
int fd_lock(int fd)
{
    struct flock lock;

    lock.l_type = F_WRLCK;
    lock.l_start = 0;
    lock.l_whence = SEEK_SET;
    lock.l_len = 0;

    return fcntl(fd, F_SETLKW, &lock);
}

// ÆÄÀÏ Àá±ÝÀ» ¾òÀºÈÄ ¸ðµç ÀÛ¾÷ÀÌ ³¡³µ´Ù¸é 
// ÀÌ ÇÔ¼ö¸¦ È£ÃâÇØ¼­ Àá±ÝÀ» µÇµ¹·ÁÁØ´Ù.
int fd_unlock(int fd)
{
    struct flock lock;

    lock.l_type = F_UNLCK;
    lock.l_start = 0;
    lock.l_whence = SEEK_SET;
    lock.l_len = 0;

    return fcntl(fd, F_SETLK, &lock);
}

int main(int argc, char **argv)
{
    int fd;
    int id;
    int i;

    char *file_name = "lock.file";

    id = atoi(argv[1]);
    if ((fd = open(file_name, O_RDWR)) < 0)
    {
        perror("open failure");
        exit(0);
    }
    if (fd_lock(fd) == -1)
    {
        perror("fd lock error");
        exit(0);
    }
    for (i = 0; i < 5; i++)
    {
        printf("file lock %d : %d\n", id, i);
        sleep(1);
    }
    if (fd_unlock(fd) == -1)
    {
        perror("fd unlock error");
        exit(0);
    }
    close(fd);
}

À§ Äڵ带 ÄÄÆÄÀÏ ÇÑ´ÙÀ½¿¡ flock¿¡¼­¿Í °°Àº µ¿ÀÏÇÑ Å×½ºÆ®¸¦ ÇØº¸¸é flock¿Í ¸¶Âù°¡Áö·Î °æÀï»óÅ¿¡ ³õÀÓÀ» ¾Ë ¼ö ÀÖ´Ù. ´ÙÀ½ Àå¿¡¼­ °æÀï»óÅÂÇØ°á¿¡ ´ëÇÑ ³íÀǸ¦ Çϵµ·Ï ÇϰڴÙ.

2.3 °æÀï»óÅ ¹®Á¦¿¡ ´ëÇØ¼­

°æÀï »óÅ´ ºñ´Ü ÆÄÀÏÀá±Ý¿¡¼­ »Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ µ¥ÀÌÅ͸¦ °øÀ¯ÇÏ´Â ¸ðµç ºÎºÐ¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¹®Á¦Á¡ÀÌ´Ù. ¿©·¯°¡Áö IPCµé ¿¹¸¦ µé¾î °øÀ¯¸Þ¸ð¸®·Î ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ Á¢±ÙÇÒ ¶§ °ú¿¬ Á¢±ÙÀ» ½ÃµµÇÑ ÇÁ·Î¼¼½ºÀÇ ¼ø¼­´ë·Î °øÀ¯¸Þ¸ð¸® Á¢±ÙÀÌ ÀÌ·ç¾î Áú°ÍÀΰ¡ ? ¼¼¸¶Æ÷¾î¿¡¼­´Â ?

¹°·Ð °æÀï»óŰ¡ ¹®Á¦°¡ µÇ´Â °æ¿ì´Â ±×¸® ÈçÇÏÁö ¾Ê°ÚÁö¸¸ Çѹø ÀÌ·± ¹®Á¦°¡ ¹ß»ýÇÏ¸é ¹®Á¦Á¡À» ã±â°¡ ¸Å¿ì ¾î·Á¿ö Áú°ÍÀÌ´Ù. ±×·¸´Ù¸é À̹ø±âȸ¿¡ °æÀï»óÅ¿¡ ´ëÇØ¼­ Á» ¾Ë¾Æº¸°í ³Ñ¾î°¡µµ·Ï ÇϰڴÙ.

2.3.1 Ä¿³Î ¾÷±×·¹À̵å
À§ÀÇ ÄÚµåµéÀ» º¸¸é flock¿Í fcntl¿¡¼­ °æÀï»óÅ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù°í Çߴµ¥, ¹Ýµå½Ã À§ÀÇ ¹®Á¦°¡ ¹ß»ýÇÏ´Â °Ç ¾Æ´Ï´Ù. À§ÀÇ °æÀï»óÅ ¹®Á¦´Â ÃÖ±ÙÀÇ Ä¿³Î¿¡¼­´Â ÇØ°áµÈ »óÅ¿¡¼­ Á¦°øµÇ¾î Áø´Ù. È®ÀÎÇØ º» °á°ú 2.4.20À» ±âÁØÀ¸·Î ÀÌÀü¿¡ ³ª¿Í ÀÖ´ø Ä¿³Î¿¡¼­´Â °æÀï»óÅ ¹®Á¦°¡ ¹ß»ýÇϰí > 2.4.20 ¹öÁ¯°ú 2.6.x¿¡¼­´Â À§ÀÇ ¹®Á¦°¡ ÇØ°á µÇ¾îÀÖÀ½À» È®ÀÎÇß´Ù.

¿©·¯ºÐÀÇ Ä¿³ÎÀ» È®ÀÎÇØ¼­ Àǽɵȴ٠½ÍÀ¸¸é ÆÄÀÏÀá±ÝÀ» Á¦°øÇϱâ Àü¿¡ ÇѹøÂë Å×½ºÆ® ÇØº¸°Å³ª ¹èÆ÷ÆÇ¿¡¼­ Á¦°øµÈ Ä¿³ÎÀ» »ç¿ëÇϰí ÀÖ´Ù¸é ¹èÆ÷ÆÇ ȨÆäÀÌÁö µî¿¡¼­ È®ÀÎÀ» ÇØº¸±æ ¹Ù¶õ´Ù. À§ÀÇ ¹®Á¦°¡ ÇØ°áµÇ¾î ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

2.3.2 O_APPEND ¸ðµå·Î ¿­±â
open(2)¸¦ º¸¸é O_APPEND ¸ðµå°¡ Á¸ÀçÇÑ´Ù. ´ÙÀ½Àº O_APPEND¸ðµå¿¡ ´ëÇÑ open ¸ÇÆäÀÌÁöÀÇ ³»¿ëÀÌ´Ù.
O_APPEND 
       The  file  is opened in append mode. Before each write, the file 
       pointer is positioned at the end of the file, as if with  lseek. 
       O_APPEND may lead to corrupted files on NFS file systems if more 
       than one process appends data  to  a  file  at  once.   This  is 
       because  NFS does not support appending to a file, so the client 
       kernel has to simulate it, which canâô be done  without  a  race 
       condition. 
 
¸Þ´º¾ó¿¡ ±â¼úµÈ°É º¸¸é O_APPEND¸ðµå·Î ¿­°æ¿ì race conditionÀ» ÇÇÇØ°¥ ¼ö ÀÖ´Ù°í µÇ¾î ÀÖ´Ù.

2.3.3 ¼¼¸¶Æ÷¾î ÀÀ¿ë
À§ÀÇ ¹æ¹ýµéÀÇ ´ÜÁ¡µéÀº ¹¹³Ä Çϸé Ä¿³Î ¾÷±×·¹À̵åÀÇ °æ¿ì ¼ÖÁ÷È÷ °æÀï»óÅ ¹®Á¦ Çϳª¸¦ À§Çؼ­ Ä¿³Î ¾÷±×·¹À̵带 ´ÜÇàÇÑ´Ù´Â °Íµµ ±×·¸°Å´Ï¿Í ´Ù¸¥ (°æÀï»óŸ¦ À¯¹ßÇÒ ¼ö ÀÖ´Â)À¯´Ð½º·Î Æ÷ÆÃÀ» ÇØ¾ß ÇÑ´Ù¸é ³­°¨ÇÏ°Ô µÉ °ÍÀÌ´Ù. ±×·¸´Ù¸é Á»´õ Ç¥ÁØÀûÀÎ ´Ù¸¥ µµ±¸¸¦ »ç¿ëÇØ¾ßµÉ Çʿ䰡 ÀÖ´Ù. ¾ÈŸ±õ°Ôµµ fcntl°ú flockµî¿¡¼­ÀÇ °æÀï»óÅ ȸÇǴ ǥÁØ»çÇ×ÀÌ ¾Æ´Ï±â ¶§¹®ÀÌ´Ù.

´ëºÎºÐÀÇ °æ¿ì¿¡´Â °æÀï»óŸ¦ °í·ÁÇÒ Çʿ䰡 ¾ø°ÚÁö¸¸ ±×·¡µµ °í·ÁÇØ¾ß ÇÏ°í ´Ù¸¥ À¯´Ð½º¿ÍÀÇ È£È¯¼ºµµ Áß¿äÇÏ´Ù¸é ¼¼¸¶Æ÷¾î¸¦ ÀÀ¿ëÇØ º¸µµ·Ï ÇÏÀÚ. system V IPC ¼³ºñÁß ÇϳªÀÎ ¼¼¸¶Æ÷¾î´Â ±âº» ½ºÆå¿¡ °æÀï»óÅÂÀÇ È¸Çǰ¡ Æ÷ÇԵǾî ÀÖÀ¸´Ï system V IPC ¼³ºñ¸¦ Á¦°øÇÏ´Â À¯´Ð½º¶ó¸é ¹Ï°í »ç¿ëÇØµµ µÈ´Ù.

¼¼¸¶Æ÷¾î ÀÀ¿ë ÄÚµå´Â ¿©±â¿¡¼­ Á¦½ÃÇÏÁö ¾Ê°Ú´Ù. ´ÙÀ½ÀÇ URLÀ» Âü°íÇϱ⠹ٶõ´Ù.
  1. http://www.joinc.co.kr/modules.php?name=News&file=article&sid=40

3 Åä·Ð¹× Àâ´ã

  1. flock¿¡¼­ LOCK_SH¸¦ ÀÌ¿ëÇßÀ» ¶§ Á¤È®È÷ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö..
  2. ´Ù¸¥ Unix¿î¿µÃ¼Á¦¿¡¼­ Àá±Ý¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¹®Á¦´Â ?
  3. ¾²·¹µå¿¡¼­ÀÇ °øÀ¯ ÆÄÀÏ¿¡ ´ëÇÑ ÆÄÀÏÀá±Ý

4 Âü°í¹®Çå

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.