|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
¼³¸í
tail±¸Çö ÇÔ¼ö ÀÔ´Ï´Ù. ÆÄÀÏ¿¡ Ãß°¡ µÇ´Â ³»¿ëÀÌ ÀÖ´ÂÁö °Ë»çÇØ¼ ÁÙ´ÜÀ§·Î ÀоîµéÀÔ´Ï´Ù. ·Î±×ÆÄÀÏ󸮸¦ À§ÇÑ ÇÁ·Î±×·¥µî¿¡ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖÀ» °Ì´Ï´Ù. ÇöÀç Àú´Â ApacheÀÇ À¥·Î±×¸¦ ºÐ¼®Çؼ PV, Hits¸¦ Åë°è³»´Â °÷¿¡ »ç¿ëÇϰí ÀÖ½À´Ï´Ù. ½Ã°£´ÜÀ§·Î ´©Àû count °ªÀ» RRD¿¡ ÀúÀåÇØ µÐ´Ù¸é, º¯È·®À» ÃøÁ¤ÇÒ ¼ö ÀְԵ˴ϴÙ.
- ÆÄÀÏÀÇ ³¡¿¡ µµ´ÞÇϸé selectÀÇ Àǹ̰¡ ¾øÀ¸¹Ç·Î
±»ÀÌ select¸¦ »ç¿ëÇÒ ÇÊ¿ä´Â ¾øÀ» °Å¶ó°í »ý°¢µÈ´Ù. ½ÇÁ¦ selectºÎºÐÀ» ÁÖ¼®Ã³¸®Çصµ Á¦´ë·Î ÀÛµ¿ÇÑ´Ù.
»ç¿ë¹æ¹ý
TAIL *opentail(char *fname);
int readtail(TAIL *LTAIL, char *buf, size_t size, int sec);
void closetail(TAIL *LTAIL);
- opentailÀº tailÀ» Àû¿ëÇÒ ÆÄÀÏÀ» ¿±â À§Çؼ »ç¿ëÇÑ´Ù. ½ÇÆÐÇϸé NULLÀ» ¸®ÅÏÇÏ°í ¼º°øÇϸé TAIL °´Ã¼(±¸Á¶Ã¼ Æ÷ÀÎÅÍ)¸¦ ¸®ÅÏÇÑ´Ù.
- readtailÀº TAIL °´Ã¼¸¦ ÀÌ¿ëÇØ¼ ÆÄÀÏ·Î ºÎÅÍ Ãß°¡µÈ ³»¿ëÀ» ÁÙ´ÜÀ§·Î ÀÐ¾î ¿Â´Ù. ÁÙÀÌ Ãß°¡µÇ¸é size¸¸Å ÀÐ¾î¼ buf¿¡ º¹»çÇÑ´Ù. Ãß°¡µÈ ÁÙÀÌ ¾øÀ» °æ¿ì sec¸¸Å ±â´Ù¸°´Ù.
- ÀÔ·ÂµÈ ÁÙÀ» ÀÐ¾î ¿Ô´Ù¸é 1À» ¸®ÅÏÇÏ°í ¾î¶² ÀÌÀ¯·Î ½ÇÆÐ ÇßÀ» °æ¿ì -1À» ¸®ÅÏÇÑ´Ù.
#include "tail.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdlib.h>
#include <vector>
using namespace std;
int main(int argc, char **argv)
{
vector<TAIL *> tflist;
TAIL *tf;
char *buf;
int n, i;
// 2°³ ÀÌ»óÀÇ ÆÄÀÏ¿¡ ´ëÇØ¼ tail °¡´ÉÇÏ´Ù.
for(i = 1; i < argc; i++)
{
if((tf = opentail(argv[i])) == NULL)
{
perror("error ");
exit(1);
}
tflist.push_back(tf);
}
buf = (char *)malloc(1024);
int issleep = 0;
while(1)
{
issleep = 0;
for(i = 0; i < tflist.size(); i++)
{
n = readtail(tflist[i], buf, 1023, 1);
if(n > 0)
printf("%d : %s", i, buf);
issleep |= n;
}
if (issleep == 0)
{
sleep(1);
printf("Sleep\n");
continue;
}
}
//closetail(tf);
free(buf);
}
ÄÚµå
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
/*
* tail °ü¸®¸¦ À§ÇÑ °´Ã¼
*/
typedef struct _TAIL
{
FILE *fp; // ÆÄÀÏ ½ºÆ®¸²
char filename[256]; // ¿ÀÇÂÇÑ ÆÄÀÏ À̸§
int fd; // ÆÄÀÏ ½ºÆ®¸²¿¡ ´ëÇÑ ÆÄÀÏ ÁöÁ¤ÀÚ
int revsize; // ÃÖ±Ù¿¡ Àоú´ø ÆÄÀÏ Å©±â
} TAIL;
/*
* tailÀ» Àû¿ëÇÒ ÆÄÀÏÀ» ¿¬´Ù.
*/
TAIL *opentail(char *fname)
{
TAIL *MTAIL;
struct stat fbuf;
MTAIL = (TAIL *)malloc(sizeof(TAIL));
if ((MTAIL->fp = fopen(fname, "r")) == NULL)
{
return NULL;
}
if (stat(fname, &fbuf) < 0)
{
return NULL;
}
strncpy(MTAIL->filename, fname, 255);
// ¿¸° ÆÄÀÏ ½ºÆ®¸²ÀÇ ÆÄÀÏÁöÁ¤ÀÚ¸¦ ¾ò¾î¿Â´Ù.
MTAIL->fd = fileno(MTAIL->fp);
MTAIL->revsize = fbuf.st_size;
return MTAIL;
}
/*
* sec½Ã°£ °£°ÝÀ¸·Î ÆÄÀÏ¿¡ Ãß°¡µÈ ³»¿ëÀ» Àоî¿Â´Ù.
* ¸¸¾à Áö±ÝÀÇ ÆÄÀÏÅ©±â°¡ ÀÌÀü ÆÄÀÏÅ©±â º¸´Ù ÀÛ´Ù¸é
* ÆÄÀÏÀÌ truncate() µÇ¾ú´Ù°í °¡Á¤Çϰí ù¶óÀÎ ºÎÅÍ
* ´Ù½Ã ÀÐ¾î µéÀδÙ.
*/
int readtail(TAIL *LTAIL, char *buf, size_t size, int sec)
{
fd_set rfds;
struct timeval tv;
int n, retval;
char *ret;
int fd;
struct stat fbuf;
FD_ZERO(&rfds);
FD_SET(LTAIL->fd, &rfds);
tv.tv_sec = sec;
tv.tv_usec = 0;
retval = select(LTAIL->fd+1, &rfds, NULL, NULL, &tv);
if (retval)
{
ret = fgets(buf, size, LTAIL->fp);
if (stat(LTAIL->filename, &fbuf) < 0)
{
return -1;
}
if (ret == NULL)
{
// ÇöÀç ÆÄÀÏÅ©±â°¡ ÀÌÀü ÆÄÀÏ Å©±â º¸´Ù
// ÀÛ´Ù¸é rewind()½ÃŲ´Ù.
if (fbuf.st_size < LTAIL->revsize)
{
rewind(LTAIL->fp);
}
LTAIL->revsize = fbuf.st_size;
return 0;
}
LTAIL->revsize = fbuf.st_size;
return 1;
}
else
{
return -1;
}
return 1;
}
void closetail(TAIL *LTAIL)
{
fclose(LTAIL->fp);
free(LTAIL);
}
|
|