2009-05-19 3 views
2

EDIT : 마지막으로 inotify를 사용했습니다. stefanB이 말했듯이, inotify가 사용할 것입니다. inotify를 사용하여 -f 모드 인 inotail을 구현하는 테일 복제본을 찾았습니다.C에서 "tail -f"기능의 사용자 지정 구현

원래 질문 텍스트 :

나는 다음과 같이 파이썬에서 개발 프로토 타입 목적으로 C 프로젝트의 "꼬리 -f"논리를 구현하기 위해 노력하고있어 :


    # A forever loop, each 5 seconds writes a line into file.txt 
    from time import * 

    while 1: 
     sleep(5) 
     file = open("file.txt", "a") 
     file.write("This is a test\n") 
     file.close() 

다음을 코드 (위의 코드에 의해 갱신) file.txt를의 EOF


    # tail -f 
    from time import * 

    file = open("file.txt", "r") 
    file.seek(0, 2) 

    while 1: 
     line = file.readline() 
     if not line: 
      sleep(1) 
     else: 
      print line 

    file.close() 

모든 잘 작동하지만 C 구현이 작동하지 않는 다음 (더 체크 오류 코드가 없습니다). stdio.h, string.h 및 unistd.h의 포함은 생략됩니다 (색상 화는 헤더 포함 코드를 숨 깁니다).


    #define LINE_LEN 256 

    int main(int argc, char **argv) 
    { 
     FILE *f; 
     char line[LINE_LEN]; 

     f = fopen("file.txt", "r"); 

     fseek(f, 0, SEEK_END); 

     while (1) 
     { 
      fgets(line, LINE_LEN, f); 

      if (strlen(line) == 0) 
      { 
       sleep(1); 
      } 
      else 
      { 
       printf("Readed: %s", line); 
      } 
     } 

     fclose(f); 

     return 0; 
    } 

몇 가지 아이디어가 있습니까?

제시된 해결책 대신 poll()을 사용하여 구현하는 것이 좋습니다.

미리 감사드립니다.

답변

3

편집에서 파일의 내용을 표시 : inotify 사용하는 것은처럼 보인다. 2.6.13부터 리눅스 커널에 포함되어야한다. An article from IBM developerworks about inotify.

이전 답 :

리눅스 File Alteration Monitor (리눅스 커널에서 2.4.x에서>)에서보세요. 그것은 파일 변경을 위해 가입하고, 변경이 일어 났을 때 커널로부터 콜백을받는 프레임 워크입니다. 이것은 폴링보다 낫습니다.

Examples

방법, 파일 변경 폴링 및 폴링이 파일을을 변경 파일의 변경 기다리는 섹션 을 확인합니다.

아직 시도하지 않았습니다.

3

FILE *에 오류 또는 eof가 있으면 내부 상태가 설정되어 후속 호출에서 오류 또는 eof를 계속 반환합니다. 수면 설정을 지우고 파일에서 더 많은 데이터를 읽으려면 수면 복귀 후 clearerr(f);으로 전화해야합니다. tailman page에서

+0

나는 그것을 시도했지만 동일한 행동을 얻었다. 감사합니다. –

2

:

이-의 파일 끝에 도달했을 때 중단하지 마십시오 -f, 오히려 추가 데이터를 기다리는는 입력에 추가합니다. 파일이 바뀌면 (예 : inode 번호가 변경됨) 꼬리가 파일을 다시 열고 계속합니다. 파일이 잘린 경우 tail은 위치를 처음으로 재설정합니다. 이로 인해 꼬리가 더 많은 로그를 볼 때 유용합니다. 파일이 회전 할 수 있습니다. 표준 입력이 파이프 인 경우 -f 옵션은 무시되지만 FIFO가 인 경우에는 무시됩니다.

  1. 사용 stat() 해당 파일의 내용을 파일
  2. 디스플레이의 inode 번호를 읽을 수 :

그래서, 당신은 같은 일을 할 수 있습니다. 파일 설명자의 위치를 ​​저장하십시오. 예 : p = ftell (fd)

  • stat()를 다시 사용하여 inode가 변경되었는지 확인하십시오. 그렇다면, 위치 p 이후
  • 반복
  • +0

    니스! 맨 페이지 섹션을 무시했습니다. 감사! –

    관련 문제