ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
¸ñÂ÷ 1 ±³Á¤ °úÁ¤
2 ÆÄÀÏÀá±×±â2.1 ÆÄÀÏÀá±ÝÀÇ Çʿ伺
ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ÆÄÀÏÀ» ¿¾î¼ ÀÛ¾÷ÇÏ´Â °æ¿ì¶ó¸é °ü°è¾ø°ÚÁö¸¸ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º³ª ¾²·¹µå°¡ ÇϳªÀÇ ÆÄÀÏÀ» ¿¾î¼ ÀÛ¾÷ÇÒ °æ¿ì ´ÙÀ½°ú °°Àº ¹®Á¦°¡ ¹ß»ýÇÒ °ÍÀ» ¿¹»óÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇÑ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº µ¿½Ã¿¡ ¿ÀÁ÷ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ÀÌ ÆÄÀÏ¿¡ Á¢±ÙÇϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ÇÁ·Î¼¼½º´Â ÆÄÀÏ¿¡ Á¢±ÙÇϱ⿡ Àá±×°í ¸ðµç ÀÏÀÌ ³¡³µÀ» ¶§ Àá±ÝÀ» Ç®µµ·Ï ÇÑ´Ù.
¶ÇÇÑ ´ýÀ¸·Î Àá±ÝÀ» À§ÇÑ Á¢±ÙÁ¦¾î¿¡¼ ¹ß»ýÇÒ ¼ö ÀÖ´Â °æÀï»óÅÂ(race condition)¹®Á¦¿¡ ´ëÇØ¼µµ °£´ÜÈ÷ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. 2.2 À¯´Ð½º¿¡¼ Á¦°øÇÏ´Â ÆÄÀÏ Àá±Ý µµ±¸2.2.1 flock(2)
flockÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù. #include <sys/file.h> int flock(int fd, int operation)
ÀÌ ÇÔ¼ö´Â ¿·ÁÁø ÆÄÀÏ¿¡ ´ëÇØ¼ ±Ç°íÀá±ÝÀ» Àû¿ëÇϰųª Á¦°ÅÇÏ´Â ÀÏÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù. ±Ç°íÀá±ÝÀ̶õ ¸»¿¡ À¯ÀÇÇØ¾ß ÇÑ´Ù. À̰ÍÀº ÆÄÀÏ¿¡ Á¢±ÙÇÏ·Á´Â ÇÁ·Î¼¼½ºµéÀÌ flock¸¦ »ç¿ëÇØ¼ Àá±ÝÀ» °Ë»çÇϵµ·Ï ¼·Î ¾à¼ÓµÇ¾î ÀÖ¾î¾ß Àá±ÝÀ» º¸ÀåÇÒ ¼ö ÀÖÀ½À» ¶æÇÑ´Ù. ¾î¶² ÆÄÀÏÀº flock¸¦ »ç¿ëÇØ¼ Àá±ÝÀ» °Ë»çÇÏ°í ¾î¶² ÆÄÀÏÀº °Ë»çÇÏÁö ¾Ê´Â´Ù¸é Àá±ÝÀ» Çϳª ¸¶³ª°¡ µÈ´Ù.
ù¹øÂ° ÀÎÀÚÀÎ fd´Â Àá±ÝÀ» Àû¿ëȤÀº ÇØÁ¦ÇÏ±æ ¿øÇÏ´Â ¿·ÁÁø ÆÄÀÏ ÁöÁ¤ÀÚ ÀÌ´Ù.
µÎ¹øÂ° ÀÎÀÚ´Â fd¿¡ ´ëÇØ¼ ÇàÇØ Áö´Â ¿¬»êÀ¸·Î ´ÙÀ½°ú °°Àº Á¾·ù°¡ ÀÖ´Ù.
´ÙÀ½Àº °£´ÜÇÑ 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À» ÀÌ¿ëÇÒ °æ¿ì ÆÄÀÏ ´ÜÀ§»Ó¸¸ ¾Æ´Ï¶ó ·¹ÄÚµå ´ÜÀ§·Îµµ Àá±ÝÀÌ °¡´ÉÇѵ¥, ÀÌ¿¡ ³»¿ëÀº ÀÌ¹Ì 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À» Âü°íÇϱ⠹ٶõ´Ù. |
|
||||||||||
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|