[리눅스] 간단한 tail -f 구현

2015. 11. 30. 00:04·IT기술 관련/리눅스
반응형

http://www.opensource.apple.com/source/text_cmds/text_cmds-9/tail/tail.c

 

출처: http://jangpd007.tistory.com/17

 

kernel 2.6.1 이상이어야 함 이하는 dnotify 사용해야 함


#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/inotify.h>

int   exitflag = 1;

int main (int argc, char *argv[])
{
  if (argc == 1)  {
    printf ("tail filename\n");
    return 0;
  }
  char  fname [256];
  sprintf (fname, "%s", argv[1]);
  FILE *fp = fopen (fname, "r");
  if (!fp)  {
    printf ("file(%s)open failed (%d:%s)\n", fname, errno, strerror (errno));
    return 0;
  }

  fseek(fp, 0, SEEK_END);
  int eventfd = inotify_init();
  if (eventfd < 0)  {
    printf ("initial inotify failed (%d:%s)\n", errno, strerror(errno));
    return 0;
  }
  int   wd = 0;
  wd = inotify_add_watch (eventfd, fname, IN_MODIFY|IN_DELETE_SELF|IN_MOVE_SELF);
  if (wd < 0) {
    printf ("add inotify watch failed (%d:%s)\n", errno, strerror(errno));
    return 0;
  }
  while (exitflag)  {
    fd_set  fdset;
    FD_ZERO (&fdset);
    FD_SET (eventfd, &fdset);
    struct  timeval tv;
    tv.tv_sec = 1;
    tv.tv_usec = 0;
    int rc = select ( eventfd + 1, &fdset, (fd_set*)NULL, (fd_set*)NULL, &tv);
    if (rc == 0)  continue;
    if (rc < 0) {
      printf ("select failed (%d:%s)\n", errno, strerror (errno));
      exitflag = 0;
      break;
    }
    if (!FD_ISSET(eventfd, &fdset)) continue;
    char  buff[1024];
    int readlen = read (eventfd, buff, sizeof (buff));
    if (readlen < 0)  {
      printf ("event read failed (%d:%s)\n", errno, strerror(errno));
      exitflag = 0;
      break;
    }
    int eventpos = 0;
    while (eventpos < readlen)  {
      struct  inotify_event *event = ( struct inotify_event*)&buff[eventpos];
      if (event->mask & IN_MODIFY)  {
        char  readbuff[1024];
        if (fgets (readbuff, sizeof (readbuff), fp) == NULL)  continue;
        printf ("%s", readbuff);
      }
      else if (event->mask & IN_DELETE_SELF || event->mask & IN_MOVE_SELF)  {
        printf ("file delete or move event recved\n");
        exitflag = 0;
        break;
      }
      eventpos += (sizeof (struct inotify_event) + event->len);
    }
  }
  inotify_rm_watch (eventfd, wd);
  close (eventfd);
  fclose (fp);
  printf ("normal terminate (exitflag = 0)\n");
  return 0;
}

반응형
저작자표시 (새창열림)

'IT기술 관련 > 리눅스' 카테고리의 다른 글

[리눅스] nmap 명령어 사용 예제  (0) 2016.07.20
[리눅스] terminfo 사용하기  (0) 2015.12.20
[Linux] 리눅스 규범 모드 vs 비규범 모드  (0) 2015.12.18
[리눅스] 서비스 등록 및 삭제  (0) 2015.11.30
[리눅스] inotify로 파일 시스템 활동 감시하기 (상)  (0) 2015.11.30
'IT기술 관련/리눅스' 카테고리의 다른 글
  • [리눅스] terminfo 사용하기
  • [Linux] 리눅스 규범 모드 vs 비규범 모드
  • [리눅스] 서비스 등록 및 삭제
  • [리눅스] inotify로 파일 시스템 활동 감시하기 (상)
호레
호레
창업 / IT / 육아 / 일상 / 여행
    반응형
  • 호레
    Unique Life
    호레
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 법률
        • 기본
        • 개인정보보호법
        • 정보통신망법
        • 전자금융거래법
        • 전자금융감독규정
        • 신용정보법
        • 온라인투자연계금융업법
      • 창업
        • 외식업 관련
        • 임대업 관련
        • 유통업 관련
        • 세무 관련
        • 마케팅 관련
        • 기타 지식
        • 트렌드
        • Youtube
      • IT기술 관련
        • 모바일
        • 윈도우
        • 리눅스
        • MAC OS
        • 네트워크
        • 빅데이터 관련
        • A.I 인공지능
        • 파이썬_루비 등 언어
        • 쿠버네티스
        • 기타 기술
      • 퍼블릭 클라우드 관련
        • Azure
        • GCP
        • AWS
      • 정보보안 관련
        • QRadar
        • Splunk
        • System
        • Web
      • 기타
        • 세상 모든 정보
        • 서적
      • 게임 관련
        • 유니티
      • 부동산
      • 맛집 찾기
        • 강남역
        • 양재역
        • 판교역
        • ★★★★★
        • ★★★★
        • ★★★
        • ★★
        • ★
      • 결혼_육아 생활
        • 리얼후기
        • 일상
        • 육아
        • 사랑
        • Food
      • 영어
        • 스피킹
        • 문법
        • 팝송
        • 영화
      • K-컨텐츠
        • 드라마
        • 영화
        • 예능
      • 독서
      • 프로젝트 관련 조사
        • 시스템 구축
        • 로그 관련
        • 웹
        • APT
        • 모의 해킹
        • DB
        • 허니팟
        • 수리카타
        • 알고리즘
        • FDS
      • 기업별 구내 식당 평가
        • 한국관광공사
        • KT telecop
        • KT M&S
        • KT powertel
        • KT cs 연수원
        • 진에어
      • 대학 생활
        • 위드윈연구소
        • 진로 고민
        • 채용정보
        • 자동차
        • 주식
        • 악성코드
        • 게임 보안
      • 쉐어하우스
  • 블로그 메뉴

    • 홈
    • 게임 관련
    • IT 기술 관련
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    마케팅
    판교
    보안가이드
    점심
    런치
    유니티
    대통령
    수제버거존맛
    판교맛집
    돈까스
    무역전쟁
    쥬쥬랜드
    복리후생
    이재곧죽습니다
    AWS
    수제버거
    판교역
    상호관세
    맛집
    수제버거맛집
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
호레
[리눅스] 간단한 tail -f 구현
상단으로

티스토리툴바