문제

비슷한 프로그램을 어떻게 구현할 수 있는지 궁금합니다. tail -f C/C++에서 로그 파일에 추가된 새 줄을 감시하고 처리하는 프로그램이요?

도움이 되었습니까?

해결책

fseek()를 사용하여 스트림에서 eof 조건을 지울 수 있습니다.기본적으로 파일 끝까지 읽고, 잠시 잠자고, fseek()(위치 변경 없이)을 통해 eof를 지우고, 파일 끝까지 다시 읽습니다.씻고, 헹구고, 반복하세요.자세한 내용은 man fseek(3)을 참조하세요.

Perl에서는 다음과 같습니다.Perl의eek()은 기본적으로 fseek(3)의 래퍼이므로 논리는 동일합니다.

wembley 0 /home/jj33/swap >#> cat p
my $f = shift;
open(I, "<$f") || die "Couldn't open $f: $!\n";

while (1) {
  seek(I, 0, 1);
  while (defined(my $l = <I>)) {
    print "Got: $l";
  }
  print "Hit EOF, sleeping\n";
  sleep(10);
}
wembley 0 /home/jj33/swap >#> cat tfile
This is
some
text
in
a file
wembley 0 /home/jj33/swap >#> perl p tfile
Got: This is
Got: some
Got: text
Got: in
Got: a file
Hit EOF, sleeping

그런 다음 다른 세션에서 다음을 수행합니다.

wembley 0 /home/jj33/swap > echo "another line of text" >> tfile

그리고 원래 프로그램 출력으로 돌아갑니다.

Hit EOF, sleeping
Got: another line of text
Hit EOF, sleeping

다른 팁

당신이 찾고 있는 것은 c/C++의 select() 호출이라고 생각합니다.여기에서 매뉴얼 페이지의 사본을 찾았습니다. http://www.opengroup.org/onlinepubs/007908775/xsh/select.html.Select는 파일 설명자를 인수로 사용하고 그 중 하나가 변경되어 읽을 준비가 되었을 때 이를 알려줍니다.

tail 프로그램은 오픈 소스이므로 참조할 수 있습니다.저도 같은 생각이 들어서 얼마전 코드를 살펴보니 꽤 간단할 줄 알았는데, 너무 복잡해서 놀랐습니다.고려해야 할 문제가 많이 있습니다.

여기를 보아라

tail을 호출하여 스트림을 다시 앱으로 검색하거나, 오픈 소스이므로 자신의 코드로 가져올 수도 있습니다.

또한 C++ iostream에서는 보기 전용으로 파일을 열고 끝까지 읽고 마지막 10-20줄을 버퍼링한 다음 출력하는 것이 가능합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top