|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
seek ¸¦ÀÌ¿ëÇÑ ÆÄÀϳ» À§Ä¡º¯°æ
À̹øÀå¿¡¼´Â ÆÄÀϳ»¿¡¼ÀÇ À§Ä¡À̵¿À» À§Çؼ ¾²ÀÌ´Â
seek °è¿ÀÇ ÇÔ¼ö¿¡ ´ëÇØ¼ ¾Ë¾Æº»´Ù.
¿ø·¡´Â lseek¿Í fseek 2°³ ¸ðµÎ¿¡ ´ëÇØ¼ ´Ù·ç¾î¾ß ÇϰÚÀ¸³ª.
»ç¿ë¹ýÀÌ °ÅÀÇ µ¿ÀÏÇÔÀ¸·Î Àú¼öÁØ ÇÔ¼öÀÎ lseek ¸¸À» ´Ù·çµµ·Ï ÇÑ´Ù.
fseek ´Â stdio.h »ç¿ëÇϱ⿡¼ Àá±ñ ´Ù·ç¾úÀ½À¸·Î Âü°íÇϵµ·Ï
ÇÏÀÚ.
Áö±Ý±îÁöÀÇ ÆÄÀϰü·Ã ÀÛ¾÷Àº óÀ½ºÎÅÍ ÀÐ¾î¼ ¼ø¼´ë·Î Ãâ·ÂÇϰųª
ȤÀº ÆÄÀÏÀÇ ¸¶Áö¸·¿¡ µ¥ÀÌŸ¸¦ ¾²´Â ÀÏÀÌ¿´´Ù.
±×·¯³ª ÀÌ·¯ÇÑ ÀÛ¾÷¸¸À¸·Î´Â ÆÄÀϰü·ÃµÈ ¸ðµç ÀÛ¾÷À» È¿À²ÀûÀ¸·Î
¼öÇàÇϱⰡ Èûµé´Ù.
¿¹¸¦ µé¾î °£´ÜÇÑ DB ÆÄÀÏÀ» ¸¸µç´Ù°í °¡Á¤Çغ¸ÀÚ.
ÀÌ·²°æ¿ì¿¡´Â ´ÜÁö ³¡¿¡ ³»¿ëÀ» Ãß°¡ÇÏ´Â°Í ¿Ü¿¡µµ,
ƯÁ¤ À§Ä¡¿¡ ÀÖ´Â µ¥ÀÌŸ¸¦ °¡Á®¿À°Å³ª, ƯÁ¤À§Ä¡¿¡ ÀÖ´Â
µ¥ÀÌŸ¸¦ »èÁ¦ÇÏ´Â µîÀÇ ÀÏÀ» ÇØ¾ß ÇÒ°ÍÀÌ´Ù.
¹°·Ð ²Ï ¹«½ÄÇÑ ¹æ¹ýÀ» »ç¿ëÇÒ¼ö ÀÖ´Ù. DB ÆÄÀÏÀÇ µ¥ÀÌŸ°¡
±¸Á¶Ã¼·Î µé¾î°£´Ù¸é, ±¸Á¶Ã¼ÀÇ Å©±â¸¸Å °è¼ÓÀоîµé¾î¼
¿øÇÏ´Â ·¹ÄÚµå±îÁö ã¾Æ°¡´Â °ÍÀÌ´Ù. Áï µ¥ÀÌŸ°¡ 100
°³ ÀÖ°í, 99 ¹øÂ° µ¥ÀÌŸ¸¦ ã±â¸¦ ¿øÇÑ´Ù¸é
struct recode
{
...
};
int main()
{
struct recode mydata;
int fd, i;
char buff[255];
....
fd = open(...);
for (i = 0; i < 99; i++)
read(fd, (void *)&buff, sizeof(recode));
}
|
´ëÃæ À§¿Í °°Àº ½ÄÀ¸·Î µ¥ÀÌŸ¸¦ ã¾Æ°¡´Â ¹æ¹ýÀÌ´Ù.
±²ÀåÈ÷ ½ÉÇÃÇÏÁö¸¸ »ó´çÈ÷ ¹«½ÄÇÑ ¹æ¹ýÀÌ´Ù.
¾î¶µç ±×·¸°Ô ÇØ¼ 99 ¹øÂ° µ¥ÀÌŸ¸¦ ã¾Ò´Âµ¥, À̹ø¿¡
´Ù½Ã 97¹øÂ° µ¥ÀÌŸ¸¦ ã¾Æ¾ß ÇÑ´Ù¸é? ´Ù½Ã ÆÄÀÏÀ» open ÇØ¼
97¹ø µ¥ÀÌŸ¸¦ Àоîµé¿©¾ß Çϴ°¡?
´ç¿¬È÷ ±×·²ÇÊ¿ä ¾ø´Ù. ´ÙÇàÈ÷µµ À¯´Ð½º¿¡¼´Â seek °è¿ÀÇ
ÇÔ¼öÀÎ lseek(2)¿Í fseek(3) À» Á¦°øÇؼ ÆÄÀÏÀÇ À§Ä¡¸¦
ÀÚÀ¯·Ó°Ô º¯°æÇÒ¼ö ÀÖµµ·Ï ÇØÁֱ⠶§¹®ÀÌ´Ù.
lseek ¿Í fseek ÀÇ Â÷ÀÌÁ¡Àº lseek °¡ Àú¼öÁØÀÇ ÆÄÀÏÁöÁ¤ÀÚ
¸¦ ÅëÇØ¼ ÀÛ¾÷À» ÇÏ´Â ¹Ý¸é fseek ´Â °í¼öÁØÀÇ ÆÄÀϽºÆ®¸²À»
ÀÌ¿ëÇØ¼ ÀÛ¾÷À» ÇÑ´Ù´Â °ÍÀÌ´Ù. ÀÏ´ÜÀûÀÎ text ¶ó¸é
fseek ¸¦ ÀÌ¿ëÇØµµ °ü°è¾ø°ÚÀ¸³ª, ±¸Á¶Ã¼¿Í °°Àº binary µ¥ÀÌŸ¸¦
´Ù·ç°íÀÚ ÇÑ´Ù¸é ¾Æ¹«·¡µµ Àú¼öÁØÇÔ¼öÀÎ lseek ¸¦ »ç¿ëÇϴ°Ô
ÁÁÀ»°ÍÀÌ´Ù.
ÆÄÀÏ¿¡¼ À§Ä¡¸¦ ÀÚÀ¯ÀÚÀç·Î ¿Å°Ü´Ù´Ï±â À§Çؼ ÇÊ¿äÇѰÍÀº
¹«¾ùÀÏ±î »ý°¢ÇØ º¸ÀÚ. À¯Àú ÀÔÀå¿¡¼
º¸¸é ÆÄÀÏÀº 1Â÷¿øÀ¸·Î µð½ºÅ©¿¡ ¿¬¼ÓÇØ¼ À§Ä¡ÇØ ÀÖ´Â
µ¥ÀÌŸÀÇ ¸ðÀ½ÀÌ´Ù(¹°·Ð OS ÀÔÀå¿¡¼ º¸¸é ÆÄÀÏÀÇ µ¥ÀÌŸ°¡
¹Ýµå½Ã ¿¬¼ÓµÇ¾î¼ À§Ä¡ÇÏ´Â°Ç ¾Æ´Ï´Ù).
1Â÷¿ø¿¡¼ ¾î¶² ¹°Ã¼ÀÇ ±Ô¸ð¸¦ ³ªÅ¸³»´Â ¿ä¼Ò´Â
±æÀ̰¡ µÉ°ÍÀÌ´Ù - 2Â÷¿øÀ̶ó¸é ¸éÀû, 3Â÷¿øÀ̶ó¸é üÀû -.
º¸Åë 1Â÷¿ø¿¡¼ ±æÀÌÀÇ Å©±â¸¦ ³ªÅ¸³»±â À§Çؼ ¿ì¸®´Â
km, m ¿Í °°Àº 1Â÷¿ø ´ÜÀ§¸¦ »ç¿ëÇÑ´Ù. ÄÄÇ»ÅÍ¿¡¼
µ¥ÀÌŸ Å©±âÀÇ ´ÜÀ§´Â ±âº»ÀûÀ¸·Î byte ÀÌ´Ù. ±×·³À¸·Î
¸¸¾à 16 byte ÀÇ µ¥ÀÌŸ°¡ ÀúÀåµÇ¾î ÀÖ´Ù¸é,
À¯Àú ÀÔÀå¿¡¼ ÀÌ µ¥ÀÌŸ´Â ´ÙÀ½°ú °°ÀÌ Disk »ó¿¡
Á¸ÀçÇÏ´Â °ÍÀ¸·Î º¸ÀϰÍÀÌ´Ù.
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--------------+
| | | ´Ù¸¥ µð½ºÅ© ¿µ¿ª
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--------------+
|
±×·¸´Ù¸é ³»°¡ 9¹øÂ° byte À§Ä¡·Î À̵¿ÇÏ°í ½Í´Ù¸é ¾î¶±ÇØ¾ß
ÇÒ±î ? º¸Åë ¾î¶² À§Ä¡¸¦ ³ªÅ¸³¾¶§ ¿ì¸®´Â ÁÂÇ¥¸¦ »ç¿ëÇÑ´Ù.
ÀÌ ÁÂÇ¥¿¡´Â 2°¡Áö Á¾·ù°¡ ÀÖÀ¸´Ï, »ó´ë ÁÂÇ¥¿Í Àý´ë
ÁÂÇ¥°¡ ¹Ù·Î ±×°ÍÀÌ´Ù. Àý´ëÁÂÇ¥¶õ ¾î¶² Àý´ëÀûÀÎ À§Ä¡¸¦
±âÁØÀ¸·Î ÇÏ¿© ÀÓÀÇÀÇ À§Ä¡¸¦ ¾Ë¾Æ³»±â À§Çؼ »ç¿ëÇÏ´Â ÁÂÇ¥¸ç,
»ó´ëÁÂÇ¥¶õ ÀÓÀÇÀÇ À§Ä¡¸¦ ±âÁØÀ¸·Î ÇØ¼ ƯÁ¤À§Ä¡¸¦ ¾Ë¾Æ³»±â
À§Çؼ »ç¿ëÇÏ´Â ÁÂÇ¥ÀÌ´Ù.
¼¿ï°ú ºÎ»ê»çÀÌ¿¡ ³ªÀÇ À§Ä¡¸¦ Àý´ëÁÂÇ¥¸¦ ÀÌ¿ëÇØ¼
Ç¥½ÃÇϰíÀÚ ÇÑ´Ù¸é "³ª´Â Áö±Ý ¼¿ï¿¡¼ ¸î Km ¶³¾îÁøÁöÁ¡¿¡
ÀÖÀ½" ÀÌ·±½ÄÀ¸·Î Ç¥ÇöÀÌ °¡´ÉÇÒ°ÍÀÌ´Ù. ¼¿ïÀÌ 0km ÁöÁ¡ÀÌ
µÇ´Â °ÍÀÌ´Ù. ±×·¯³ª »ó´ëÁÂÇ¥Àϰæ¿ì ³ªÀÇ À§Ä¡°¡ 0km ÁöÁ¡ÀÌ
µÇ¸ç ³ª¸¦ ±âÁØÀ¸·Î ¾î¶² À§Ä¡¸¦ ÁöÁ¤ÇÏ°Ô µÉ°ÍÀÌ´Ù.
¼¿ï ³ª ¸¶»ê ºÎ»ê
+----------------------+----------+--------------------+
| | |
+--------- 180 km -----+-- 20km --+
| |
+------------- 200 km ------------+
¸¶»ê±îÁöÀÇ °Å¸®
Àý´ëÁÂÇ¥ »ó¿¡¼ : 200 km
»ó´ëÁÂÇ¥ »ó¿¡¼ : 20 km (±âÁØ "³ª")
|
ÀÌ·¯ÇÑ À§Ä¡¸¦ ¾Ë¾Æ³»±â À§Çؼ Çö½Ç¿¡¼ »ç¿ëµÇ´Â
±â¹ýÀÌ DISK »ó¿¡¼µµ ±×´ë·Î Àû¿ëµÈ´Ù.
Áï ÆÄÀÏÀÇ Ã³À½ ½ÃÀÛÁöÁ¡ÀÎ 0 À» À§Ä¡·Î ½ÃÀÛÁöÁ¡¿¡¼ ¶³¾îÁø
byte ¼ö¸¸ÅÀ¸·Î °è»êÇÏ´Â ¹æ¹ý°ú, ÇöÀç ÆÄÀÏÁöÁ¤ÀÚ°¡
À§Ä¡Çϰí ÀÖ´Â À§Ä¡¿¡¼ byte ¼ö¸¸ÅÀ» °è»êÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù.
¿¹¸¦ µéÀÚ¸é ÇöÀç ÆÄÀÏÁöÁ¤ÀÚ°¡ °¡¸£Å°´Â °÷ÀÌ 7 À̰í
À̵¿ÇϰíÀÚ ÇÏ´Â °÷ÀÌ 12 À϶§, óÀ½ºÎÅÍ ½ÃÀÛÇØ¼ 12 ¸¸Å
ÆÄÀÏÁöÁ¤ÀÚ¸¦ À̵¿½ÃŰ´Â ¹æ¹ý°ú ÇöÀç À§Ä¡¿¡¼ ½ÃÀÛÇØ¼
5¸¸ÅÀ» À̵¿½ÃŰ´Â ¹æ¹ýÀÌ ÀÖÀ»°ÍÀÌ´Ù.
lseek ¸¦ ¼³¸íÇϱâ À§Çؼ ÀÌ·±Àú·± ¾ê±â¸¦ ¸¹ÀÌ Çߴµ¥,
lseek ´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
|
fd ´Â ÆÄÀÏÁöÁ¤ÀÚÀÌ´Ù. ¹Ù·Î 2 ¹øÂ° offset ÀÌ °Å¸®¸¦
³ªÅ¸³»±â À§Çؼ »ç¿ëµÈ´Ù. ±×·¸´Ù¸é ±âÁØÁ¡Àº ?
´ç¿¬ÇϰÚÁö¸¸(--;) whence ¸¦ ÀÌ¿ëÇÏ°Ô µÈ´Ù. whence °ªÀÌ
ÀÌ whence ´Â ´ÙÀ½°ú °°Àº °ªÀ» »ç¿ëÇÒ¼ö ÀÖ´Ù.
- SEEK_SET
ÆÄÀÏÀÇ ½ÃÀÛÁ¡ÀÌ´Ù. À̸¦Å׸é Àý´ëÀ§Ä¡¸¦
°è»êÇϱâ À§ÇÔÀÌ´Ù.
- SEEK_CUR
ÆÄÀÏÁöÁ¤ÀÚ fd °¡ À§Ä¡Çϰí ÀÖ´Â ÁöÁ¡À» ±âÁØÀ¸·Î
°è»êµÈ´Ù. À̸¦Å×¸é »ó´ëÀ§Ä¡¸¦ °è»êÇϱâ À§ÇÔÀÌ´Ù.
- SEEK_END
ÆÄÀÏÀÇ ¸¶Áö¸·À§Ä¡ÀÌ´Ù. SEEK_SET ¿Í ¸¶Âù°¡Áö·Î
Àý´ë°ªÀ̶ó°í ÇÒ¼ö ÀÖ´Ù ´Ù¸¸ ±âÁØÁ¡ÀÌ ÆÄÀÏÀÇ
¸¶Áö¸·À̶ó´Â °Í¸¸ ´Ù¸£´Ù.
lseek ¸¦ ÅëÇÑ À§Ä¡ À̵¿Àº whence ¿¡¼ÀÇ offset À» ´õÇÔÀ¸·Î½á
ÀÌ·ç¾î Áö°Ô µÈ´Ù. ¿¹¸¦µé¾î¼ ÆÄÀÏÀÇ Ã³À½ À§Ä¡·Î
À̵¿ÇÏ°í ½Í´Ù¸é lseek(fd, 0, SEEK_SET) ÇÏ¸é µÈ´Ù.
¸¶Áö¸·Àº lseek(fd, 0, SEEK_END) ÀÌ´Ù.
´ç¿¬È÷ offset Àº À½¼ö°ªÀÌ µé¾î°¥¼öµµ ÀÖ´Ù.
´ÙÀ½ÀÇ ¿¹¸¦ º¸ÀÚ.
¿¹Á¦ : seek.c
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
int fd ;
char buff[255];
memset(buff, 0x00, 255);
fd = open("test.txt", O_RDONLY);
if (fd < 0)
{
perror("error : ");
exit(0);
}
lseek(fd, -3, SEEK_END);
read(fd, buff, 255);
printf("%s", buff);
close(fd);
}
|
test.txt ÆÄÀÏ¿¡´Â "01234567890\n" ÀÌ µé¾î ÀÖ´Ù°í
°¡Á¤Çϸé À§ÀÇ ÇÁ·Î±×·¥ ½ÇÇà°á°ú·Î "90\n" ÀÌ ÂïÈú°ÍÀÌ´Ù.
Âü°í·Î ½Ç¼ö·Î ÆÄÀÏÀÇ ¸¶Áö¸·À» Ãʰú ÇØ¼
lseek ¸¦ »ç¿ëÇßÀ»°æ¿ì - lseek(fd, 10, SEEK_END)°ú °°ÀÌ -
lseek ¿¡¼ ¿¡·¯°¡ ¹ß»ýÇÏÁø ¾ÊÁö¸¸ write ȤÀº read ÇÒ°æ¿ì
¿¡·¯°¡ ¹ß»ýÇÏ°Ô µÇ¹Ç·Î ÁÖÀÇ ÇØ¾ß ÇÑ´Ù.
À§ÀÇ lseek ¸¦ ÀÌ¿ëÇØ¼ °£´ÜÇÑ ÀÀ¿ë ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µé¾î
º¸ÀÚ.
¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥Àº °£´ÜÇÑ Çü½ÄÀÇ DB ¾îÇø®ÄÉÀ̼ÇÀÌ´Ù.
ÀÌ ¾îÇø®ÄÉÀ̼ÇÀÌ °¡ °ü¸®ÇÏ´Â DB ´Â À̸§°ú ÀüȹøÈ£ÀÌ´Ù.
DB ¿¡´Â À̸§°ú ÀüȹøÈ£¸¦ ¸â¹öº¯¼ö·Î ÇÏ´Â
±¸Á¶Ã¼°¡ ÀúÀåµÇ´Â Çü½ÄÀ»
ÃëÇÏ°Ô µÉ°ÍÀÌ´Ù.
DB °ü¸® ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µéÀû¿¡ °¡ÀåÁß¿äÇѰÇ
DB ¸í¼¼¿Í ÀÌ DB ¸í¼¼¸¦ Áö¿øÇÒ¼ö ÀÖ´Â ÆÄÀϱ¸Á¶ÀÏ
°ÍÀÌ´Ù. DB ´Â ´ÜÀϱ¸Á¶Ã¼°¡ ÇϳªÀÇ ·¹ÄÚµå´ÜÀ§°¡
µÇ¾î¼ ¿¬¼®µÇ°Ô ÀúÀåµÉ °ÍÀÌ´Ù.
ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°´Ù.
typedef struct _data
{
int num;
char name[16];
char tel_num[16];
} Data;
|
name Àº À̸§À̰í tel_num Àº ÀüȹøÈ£ÀÌ´Ù. num Àº
ÀϷùøÈ£Àε¥, ¾îÇø®ÄÉÀ̼ǿ¡¼ ÀÚµ¿ÀûÀ¸·Î ºÎ¿©ÇÏ°Ô µÉ°ÍÀÌ´Ù.
´ÙÀ½Àº DB ÆÄÀÏ ¸í¼¼ÀÌ´Ù.
´ÜÀ§ : byte
0 1 2 3 4 5 6 7 8 9 0 1 .......
+-+-+-+-+-+-+-+-+-+-+-+-+-------------+-------------+
|DBINFO |R_NUM |INC_NUM| RECODE 1... | RECODE 2... |
+-+-+-+-+-+-+-+-+-+-+-+-+-------------+-------------+
|
DBINFO ´Â DB ¾îÇø®ÄÉÀ̼ÇÀÌ ÀÌ ÆÄÀÏÀÌ ÀÚ½ÅÀÌ °ü¸®ÇÏ´Â
Æ÷¸ËÀ» Áö¿øÇÏ´Â ÆÄÀÏÀÎÁö¸¦ ¾Ë·ÁÁÖ±â À§Çؼ »ç¿ëÇÑ´Ù.
Á¦´ë·Î ÇÏ·Á¸é ¹öÁ¯Á¤º¸¿Í °°Àº ºÎ°¡ÀûÀÎ Á¤º¸µµ µé¾î°¡¸é
ÁÁ°ÚÁö¸¸ ¿©±â¿¡¼´Â ´ÜÁö ÆÄÀÏÀÇ °¡Àå¾Õ¿¡ "MYDB"¶ó´Â
¹®ÀÚ¸¦ ½áÁÖ°í ¾îÇø®ÄÉÀ̼ÇÀº ÆÄÀÏÀ» ÀоîµéÀ϶§ MYDB ¹®ÀÚ¿À»
È®ÀÎÇÏ´Â Á¤µµ·Î DBÆÄÀÏÀ» ÆÇº°ÇÏ´Â °ÍÀ¸·Î ÇϰڴÙ.
R_NUM Àº ÇöÀç ÀÌ DB ÆÄÀÏÀÌ ¸î°³ÀÇ Recode ¸¦ Æ÷ÇÔÇϰí
ÀÖ´ÂÁö¸¦ ³ªÅ¸³½´Ù. insert °¡ ÀÖÀ»°æ¿ì Áõ°¡Çϰí delete °¡
ÀÖÀ»°æ¿ì °¨¼ÒÇÒ °ÍÀÌ´Ù.
INC_NUM Àº Recode ¿¡ ÀϷùøÈ£¸¦ ÁÖ±â À§Çؼ »ç¿ëµÇ¸ç,
Áõ°¡¸¸ ÇÏ¸ç °¨¼ÒÇÏÁö´Â ¾Ê´Â´Ù. Data.num ¿¡ °ªÀ» ÁÙ¶§
INC_NUM À» ÁÖ°Ô µÈ´Ù.
Recode ÀÇ »èÁ¦ÀÇ °æ¿ì ½ÇÁ¦ µ¥ÀÌŸ »èÁ¦°¡ ÀϾÁö´Â
¾ÊÀ¸¸ç ´ÜÁö ÇØ´ç ·¹ÄÚµåÀÇ Data.num ÀÇ °ª¿¡ (-1) À»
°öÇØÁÖ´Â °ÍÀ¸·Î "»èÁ¦Ç¥½Ã"¸¸ ÇÒ°ÍÀÌ´Ù.
ÀÌ·¸°Ô ÇÏ´Â ÀÌÀ¯´Â ³ªÁß¿¡ µ¥ÀÌŸ¸¦ º¹±¸ÇÒ¼ö ÀÖ´Â ¿©Áö¸¦
³²°ÜÁÖ´Â°Í ¿Ü¿¡µµ(´ÜÁö Data.num*(-1)¸¸ ÇØÁÖ¸é º¹±¸µÈ´Ù)
ÀüüÀûÀÎ ¾îÇø®ÄÉÀ̼ÇÀÇ ¼º´ÉÀ» Çâ»ó½Ãų¼ö Àֱ⠶§¹®ÀÌ´Ù.
¸¸¾à¿¡ ·¹Äڵ带 ½ÇÁ¦·Î Áö¿ì°Ô µÈ´Ù¸é, ºñ¿öÁø °÷À» ä¿ì±â
À§Çؼ ±×µÚ¿¡ ÀÖ´Â ¸ðµç ·¹Äڵ带 ¾Õ´ç°Ü¼ ºó·¹ÄÚµå
°ø°£À» ä¿öÁà¾ß ÇÒ°ÍÀÌ´Ù. À̰ÍÀº ¸¹Àº ¼º´ÉÀÇ ¼Õ½ÇÀ»
°¡Á®´Ù ÁØ´Ù. ƯÈ÷ ¿©·¯¸íÀÌ µ¿½Ã¿¡ ÀÛ¾÷À» ÇÏ´Â °ÍÀ»
¿°µÎ¿¡ µÎ°í ¾îÇø®ÄÉÀ̼ÇÀÌ °³¹ßµÉ°æ¿ì ·¹ÄÚµå Àá±Ý°ú ÆÄÀÏÀá±Ý
±×¸®°í ·¹ÄÚµåÀÇ À§Ä¡¸¦ »ç¿ëÀÚ°£¿¡ ¸ðµÎ µ¿±â½ÃÄÑÁà¾ß ÇÏ´Â
¸Å¿ì ±î´Ù·Î¿î ¹®Á¦¸¦ ÇØ°áÇØ¾ß ÇÑ´Ù. ±×·¯³ª "Ç¥½Ã"¸¸
ÇØ³õÀ»°æ¿ì¿¡´Â ¾îÇø®ÄÉÀ̼ÇÀÌ ÀÌ "Ç¥½Ã"¸¸ ÀÐ°í ÆÇ´ÜÇϸé
µÊÀ¸·Î ±¸ÇöÇϱⰡ ¸Å¿ì °£´ÜÇØ Áø´Ù.
½ÇÁ¦ Oracle °°Àº°æ¿ìµµ DB »èÁ¦µîÀÌ ÀϾÀ»¶§,
°ð¹Ù·Î Áö¿ìÁö ¾Ê°í ´ÜÁö "Ç¥½Ã" ¸¸ ÇØµÎ°í
Á¤¸®ÇØ¾ßµÉ ÀÏÀÌ ÀÖÀ»¶§ DBA°¡ Á¤¸®¸¦ ÇØÁÖ¸ç,
(»èÁ¦ Ç¥½ÃµÈ ·¹Äڵ带 Á÷Á¢ Áö¿öÁÖ°í ºó·¹ÄÚµå °ø°£À»
¾ø¾ÖÁÖ´Â)
¸¸¾àÀÇ °æ¿ì º¹±¸ÇÒ¼ö ÀÖ´Â ¿©Áö¸¦ ³²°ÜµÐ´Ù.
°ø°³ RDBMS ÀÎ Postgresl ¿ª½Ã delete µîÀÌ ³»·ÁÁ³À»¶§
¹°¸®ÀûÀ¸·Î µ¥ÀÌŸ¸¦ »èÁ¦ÇÏÁö ¾ÊÀ¸¸ç, "»èÁ¦Ç¥½Ã" µÈ
ü·Î °ø°£À» Â÷ÁöÇÏ¸ç ³²¾Æ ÀÖ°Ô µÈ´Ù.
ÀÌ°Ô Á¡Á¡ ½×Àϰæ¿ì ÆÄÀÏÀÇ Å©±â°¡ Ä¿Áö°í, ÀüüÀûÀÎ ¼º´ÉÀÌ
¶³¾îÁüÀ¸·Î vacuum µîÀÇ µµ±¸¸¦ ½á¼ Á¤¸®ÇØÁØ´Ù.
lseek ÀÇ »ç¿ë¹æ¹ý ¿Ü¿¡µµ ¸î°¡Áö ºÎ¼öÀûÀÎ Á¤º¸¸¦ ¾òÀ»¼ö
ÀÖ°ÚÁö¸¸ ¾îµð±îÁö³ª ÁÖ ¸ñÀûÀº lseek ÀÇ »ç¿ë¹ý¿¡ ´ëÇÑ
³»¿ëÀÌ´Ù. ±×·¯¹Ç·Î ±³°ú¿¡¼ º½Á÷ÇÑ ÁøÂ¥ ±×·²µíÇÑ
DB ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µéÁö´Â ¾ÊÀ»°ÍÀÌ´Ù. °¡Àå °£´ÜÇÑ
¼öÁØÀÇ DB ¾îÇø®ÄÉÀ̼ÇÀÌ µÉ°ÍÀÌ´Ù.
- ¸®½ºÆ®º¸±â
¸ðµç ·¹ÄÚµåÀÇ ¸®½ºÆ®¿Í Á¤º¸¸¦ º¸¿©ÁØ´Ù.
- ¸®½ºÆ®Ãß°¡
»õ·Î¿î ·¹Äڵ带 Ãß°¡ÇÑ´Ù.
·¹ÄÚµå Ãß°¡´Â Data ±¸Á¶Ã¼¸¦ write ÇÔÀ¸·Î½á
ÀÌ·ç¾îÁö¸ç À̶§ R_NUM, INC_NUM ÀÌ 1¾¿ Áõ°¡ÇÏ°Ô µÈ´Ù.
Data.num Àº INC_NUM ÀÌ µé¾î°¡°Ô µÈ´Ù.
- ¸®½ºÆ®»èÁ¦
ÁöÁ¤µÈ ·¹Äڵ带 »èÁ¦ÇÑ´Ù.
R_NUMÀº 1 °¨¼ÒµÈ´Ù. ±×·¯³ª INC_NUMÀº °¨¼ÒµÇÁö ¾Ê´Â´Ù.
- ¸®½ºÆ®¾÷µ¥ÀÌÆ®
³»¿ëÀ» ¾÷µ¥ÀÌÆ® ÇÑ´Ù.
¿©±â¿¡¼´Â ±¸ÇöÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù. Á÷Á¢
±¸ÇöÇØ º¸±â ¹Ù¶õ´Ù.
ncurses ¸¦ »ç¿ëÇÏ´Â°Ç ³Ê¹« ¸¹Àº ½Ã°£ÀÌ °É¸±°Í °°¾Æ¼
±×³É °£´ÜÇÏ°Ô ANSI ¸¦ »ç¿ëÇϱâ·Î Çß´Ù.
ANSI ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ¾È½Ã »ç¶û³Ý¸¦ Âü°íÇϱ⠹ٶõ´Ù.
ANSI ÄÚµåÀÇ ÀÔ·ÂÀº CTRL+V,CTRL+[ ÇÑ´ÙÀ½¿¡ "[¾È½Ã¹øÈ£" ÀÌ´Ù.
¿¹¸¦µéÀÚ¸é ȸéÀ» Áö¿ì±â À§ÇÑ ¾È½Ã ¹øÈ£´Â 2J Àε¥,
ÀÌ ¹øÈ£¸¦ ÀÌ¿ëÇØ¼ ¾È½ÃÄڵ带 ¸¸µé·Á¸é
CTRL+V,CTRL+[ ŰÀÔ·ÂÈÄ [2J ÇÏ¸é µÈ´Ù.
´ÙÀ½Àº ½ÇÁ¦ ÀÛµ¿µÇ´Â ¿¹Á¦ ÄÚµåÀÌ´Ù. ¾î·Á¿î ³»¿ëÀº
¾øÀ½À¸·Î ÁÖ¼®À¸·Î ´ë½ÅÇϵµ·Ï ÇϰڴÙ.
¾Æ·¡ÄÚµå´Â ÇнÀ¸ñÀûÀ¸·Î ¿¬½À»ï¾Æ ¸¸µç ÄÚµåÀÌ´Ù.
¿¡·¯Ã³¸®, ÀÔÃâ·Â°Ë»ç, ÄÚµå È¿À²¼º, ÀÎÅÍÆäÀ̽º µîÀº
¿°µÎ¿¡ µÎÁö ¾ÊÀº ÄÚµåÀÌ´Ù. ¼û¾îÀÖ´Â ¹ö±×¸¦ Àâ°Å³ª
±ú²ýÇÏ°Ô Äڵ带 ´Ù½Ã ¸¸µé¾î º¸´Â°Íµµ ¸¹Àº µµ¿òÀÌ µÉ°ÍÀÌ´Ù.
¿¹Á¦ : seek_db.c
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
// DB Æ÷¸Ë È®Àοë
#define APPNAME "MYDB"
// ANSI ÄÚµå
// ½ºÅ©¸° Áö¿ì±â
#define SCR_CLEAR printf("^[[2J")
// x,y ÁÂÇ¥·Î Ä¿¼À̵¿Çϱâ
#define MOVE_CURSOR(x, y) printf("^[[%d;%dH", x, y)
// ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°í »ç¿ëÀÚ ÀÔ·ÂÀ» ±â´Ù¸°´Ù.
// ½ºÅ©¸° Áö¿ì±â Àü¿¡ ¸Þ½ÃÁö¸¦ È®ÀÎÇÒ ¸ñÀûÀ¸·Î
// »ç¿ëµÈ´Ù.
#define WAIT_INPUT(x) printf("%s", x);getchar()
// °³Ç๮ÀÚ Á¦°Å
#define chop(str) str[strlen(str)-1] = '\0';
// Çì´õÀÇ Å©±â Á¤ÀÇ
// Çì´õ´Â recode ¸¦ Á¦¿ÜÇÑ ÆÄÀÏÀÇ °¡Àå¾Õ¿¡ ÀÖ´Â
// Á¤º¸ÀÌ´Ù.
// DB Æ÷¸Ë Á¤º¸ Å©±â
#define DBINFO_SIZE strlen(APPNAME)
// R_NUM,INC_NUM Å©±â
#define INDEX_SIZE sizeof(int)*2
// Àüü Çì´õ Å©±â
#define HEADER_SIZE INDEX_SIZE + DBINFO_SIZE
// ¸ÞÀθ޴º
char *menu =
"
µ¥ÀÌŸ¼ö : %d
====================
1. ¸®½ºÆ® º¸±â
2. ¸®½ºÆ® Ãß°¡
3. ¸®½ºÆ® »èÁ¦
4. Á¾·á
====================
input : ";
// ·¹ÄÚµå ÀÔ·Â ¸Þ´º
char *input_menu =
"
¹ø È£ :
ÀÌ ¸§ :
ÀüȹøÈ£ :
";
// ·¹ÄÚµå ±¸Á¶Ã¼
typedef struct _data
{
int num; // ÀϷùøÈ£
char name[16]; // À̸§
char tel_num[16]; // ÀüȹøÈ£
} Data;
// R_NUM, INC_NUM
typedef struct _index_num
{
int datanum; // R_NUM : µ¥ÀÌŸ ÃѰ¹¼ö
int incnum; // INC_NUM : µ¥ÀÌŸ ÀϷùøÈ£
} Index_num;
// Index_num °ª Áï R_NUM °ú INC_NUM
// À» ¾ò¾î¿Â´Ù.
Index_num get_indexnum(int fd)
{
Index_num index_num;
lseek(fd, DBINFO_SIZE, SEEK_SET);
read(fd, (void *)&index_num, HEADER_SIZE);
return index_num;
}
// DB ÆÄÀÏÀ» üũÇÑ´Ù.
// ÆÄÀÏÀÇ Ã³À½ 4¹ÙÀÌÆ® ¹®ÀÚ°¡ APPNAME °ú °°À¸¸é Âü
int dbcheck(fd)
{
char dbname[8];
memset(dbname,0x00,8);
read(fd, dbname, 8);
if (strncmp(dbname, APPNAME, DBINFO_SIZE) ==0)
return 1;
else
return -1;
}
// ÃÖÃÊ¿¡ DBÆÄÀÏÀÌ »ý¼ºµÇÁö
// ¾Ê¾ÒÀ»¶§ DB ÆÄÀÏÀ» ÃʱâÈ ½ÃÄÑÁØ´Ù.
// DB Æ÷¸äÁ¤º¸(APPNAME)ÀÌ µé¾î°¡°í R_NUM, INC_NUM
// Àº 0À¸·Î ÃʱâÈ µÈ´Ù.
int init_datanum(int fd)
{
Index_num index_num;
write(fd, APPNAME, DBINFO_SIZE);
memset((void *)&index_num, 0x00, INDEX_SIZE);
write(fd, (void *)&index_num, INDEX_SIZE);
}
// ·¹Äڵ尡 insert µÇ¾úÀ» °æ¿ì
// R_NUM°ú INC_NUM À» Áõ°¡½ÃŲ´Ù.
int inc_indexnum(int fd)
{
int datanum;
Index_num index_num;
index_num = get_indexnum(fd);
index_num.datanum++;
index_num.incnum++;
lseek(fd, DBINFO_SIZE, SEEK_SET);
write(fd, (void *)&index_num, INDEX_SIZE);
return 1;
}
// ¸ÞÀÎ ¸Þ´º¸¦ Ãâ·ÂÇÑ´Ù.
void print_main_menu(fd)
{
Index_num index_num;
index_num = get_indexnum(fd);
printf(menu,index_num.datanum);
}
// ¼ºê¸Þ´º¸¦ Ãâ·ÂÇÑ´Ù.
void print_menu(char *sub_menu)
{
printf(sub_menu);
}
// ·¹Äڵ带 »ðÀÔÇÑ´Ù.
// ·¹ÄÚµå »ðÀÔÀ§Ä¡´Â ÆÄÀÏÀÇ ¸¶Áö¸·ÀÌ´Ù.
void input_data(Data mydata, int fd)
{
// ÆÄÀÏÀÇ ¸¶Áö¸·À¸·Î À̵¿
lseek(fd, 0, SEEK_END);
write(fd, (void *)&mydata, sizeof(Data));
inc_indexnum(fd);
}
// ·¹ÄÚµå ¸®½ºÆ®¸¦ Ãâ·ÂÇÑ´Ù.
void print_data(int fd)
{
int i;
int offset = 0;
Data list;
Index_num index_num;
index_num = get_indexnum(fd);
// ·¹ÄÚµåÀÇ ½ÃÀÛÀ§Ä¡·Î À̵¿ÇÑ´Ù.
lseek(fd, HEADER_SIZE, SEEK_SET);
for (i = 0; i < index_num.datanum; )
{
read(fd, (void *)&list, sizeof(Data));
if (list.num > 0)
{
i++;
printf("%3d %16s %16s\n", list.num, list.name, list.tel_num);
}
}
}
// ·¹Äڵ带 »èÁ¦ÇÑ´Ù.
// ½ÇÁ¦·Î µ¥ÀÌŸ¸¦ »èÁ¦ÇÏÁö´Â ¾ÊÀ¸¸ç
// Data.num ¿¡ (-1)À» °öÇØÁØ´Ù.
int del_data(int fd,int num)
{
int offset;
int del_flag;
Data list;
Index_num index_num;
index_num = get_indexnum(fd);
printf("delete num is %d\n", num);
// ÀÔ·ÂµÈ ¹øÈ£°¡ 1 º¸´Ù À۰ųª ·¹ÄÚµå ¼öº¸´Ù Ŭ°æ¿ì
if ((index_num.incnum-1) > index_num.incnum || num < 1)
return -1;
// »èÁ¦ÇϰíÀÚ ÇÏ´Â ·¹ÄÚµåÀÇ À§Ä¡·Î À̵¿ÇÑ´Ù.
offset = (sizeof(Data)*(num-1)) + HEADER_SIZE;
lseek(fd, offset, SEEK_SET);
read(fd, (void *)&list, sizeof(Data));
if (list.num < 0)
{
printf("list.num is : %d\n", list.num);
return -2;
}
del_flag = list.num*(-1);
// »èÁ¦ÇϰíÀÚ ÇÏ´Â ·¹ÄÚµåÀÇ À§Ä¡·Î À̵¿Çؼ
// list.num*(-1) °ªÀ» ÀÔ·ÂÇÑ´Ù.
lseek(fd, offset, SEEK_SET);
write(fd, (void *)&(del_flag), sizeof(int));
// R_NUM À» 1 °¨¼Ò½ÃŲ´Ù.
lseek(fd, DBINFO_SIZE, SEEK_SET);
index_num.datanum--;
write(fd, (void *)&(index_num), INDEX_SIZE);
return 1;
}
// ¸Þ´º¼±Åÿ¡ ´ëÇÑ Ã³¸®
void sel_menu(fd)
{
char menu_num;
Index_num index_num;
// R_NUM°ú INC_NUM À» ±¸Çؿ´Ù.
index_num = get_indexnum(fd);
while(1)
{
Data mydata;
char buf[11];
char num[11];
int state;
char data[16];
SCR_CLEAR; // ȸé clear
MOVE_CURSOR(1,1); // Ä¿¼À̵¿
print_main_menu(fd); // Main ¸Þ´ºÃâ·Â
fgets(num, 11, stdin);
// ÀԷ¹øÈ£¿¡ µû¶ó ºÐ±âÇÑ´Ù.
switch(atoi(num))
{
// ¸®½ºÆ® Ãâ·Â
case 1 :
print_data(fd);
WAIT_INPUT("Press any key!!");
break;
// ÀÔ·Â
case 2 :
SCR_CLEAR;
MOVE_CURSOR(1,1);
print_menu(input_menu);
MOVE_CURSOR(2,12);
printf("%d", ++index_num.incnum);
mydata.num = index_num.incnum;
MOVE_CURSOR(3,12);
fgets(mydata.name, 16, stdin);
chop(mydata.name);
MOVE_CURSOR(4,12);
fgets(mydata.tel_num, 16, stdin);
chop(mydata.tel_num);
input_data(mydata, fd);
WAIT_INPUT("Press any key!!");
break;
// »èÁ¦
case 3 :
MOVE_CURSOR(10,1);
printf("»èÁ¦¹øÈ£ ");
fgets(buf, 11, stdin);
state = del_data(fd, atoi(buf));
if (state < 0)
{
printf("À߸øµÈ¹øÈ£ ¼±ÅÃ\n");
}
WAIT_INPUT("Press any key!!");
break;
case 4 :
printf("bye bye\n");
exit(0);
default :
break;
}
}
}
int main(int argc, char **argv)
{
int data_num = 0;
int is_fileok = 0;
int fd;
Data mydata;
if (argc != 2)
{
printf("Usage : ./seek_db dbfile\n");
exit(0);
}
if ((access(argv[1], F_OK) == 0))
{
is_fileok = 1;
}
fd = open(argv[1], O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
if (fd < 0)
{
perror("error : ");
exit(0);
}
if (is_fileok == 0)
{
printf("FILE INIT\n");
init_datanum(fd);
}
else
{
if (dbcheck(fd) != 1)
{
fprintf(stderr, "%s ´Â À߸øµÈ DB ÆÄÀÏÀÔ´Ï´Ù\n", argv[1]);
exit(0);
}
}
sel_menu(fd);
close(fd);
return 1;
}
|
ÀÌ»ó °£´ÜÇÏ°Ô lseek ¿¡ ´ëÇØ¼ ¾Ë¾Æº¸°í, lseek ¸¦ »ç¿ëÇÑ
ÀÀ¿ë ¾îÇÃÀÇ °³¹ßÀ» ÇØº¸¾Ò´Ù. À§ÀÇ ÀÀ¿ë ¾îÇÃÀÇ °æ¿ì
recode »èÁ¦ÈÄ ºñ¾îÀÖ´Â recode °ø°£À» Á¦°ÅÇØÁÖ´Â ±â´ÉÀ»
±¸ÇöÇϰí ÀÖÁö ¾ÊÀºµ¥, º°µµÀÇ ¾îÇø®ÄÉÀ̼ÇÀ¸·Î
Çѹø Á¦ÀÛÇØ º¸±â ¹Ù¶õ´Ù. lseek ¸¦ ½áÁÖ°í truncate Á¤µµ¸¸
½áÁÖ¸é ¾î·ÆÁö ¾Ê°Ô ÀÛ¼ºÇÒ¼ö ÀÖÀ» °ÍÀÌ´Ù.
±×¸®°í ¿©·¯À¯Àú°¡ µ¿½Ã¿¡ »ç¿ë°¡´ÉÇϵµ·Ï ·¹ÄÚµåÀá±ÝµîÀ»
±¸ÇöÇÏ¸é ´õ ±×·²µíÇÑ ¾îÇø®ÄÉÀ̼ÇÀÌ µÉ°ÍÀÌ´Ù.
|
|