2013-06-16 4 views
3

다음 코드 단편을 고려하십시오.새로운 데이터 가용성에 대한 파일 설명자를 모니터하는 방법은 무엇입니까?

#include <fcntl.h> 
#include <stdio.h> 
#include <sys/poll.h> 
#include <unistd.h> 

int main(int argc, char ** argv) { 
    int fd; 
    char buf[1024]; 
    int i; 
    struct pollfd pfds; 
    fd = open(argv[1], O_RDONLY); 

    while (1) { 
     pfds.fd = fd; 
     pfds.events = POLLIN; 

     poll(&pfds, 1, -1); 

     if (pfds.revents & POLLIN) { 
      i = read(fd, buf, 1024); 

      write(1, buf, i); 
     } 
    } 

    return 0; 
} 

이 프로그램은 파일 이름을 받고, 해당 파일을 열고, 파일 디스크립터를 "폴링 (poll)"하여 가용성 데이터를 모니터합니다. poll이 가용성의 데이터를 감지 할 때마다 새 데이터가 인쇄됩니다.

그러나이 프로그램은 어떻게됩니까? 프로그램을 시작할 때 모니터링 할 파일에 이미 포함 된 데이터가 있으면 해당 내용이 인쇄됩니다. 괜찮아. 그러나 나중에 텍스트 편집기로 파일을 편집하여 저장하면 프로그램이 새 데이터를 인쇄하지 않습니다.

그렇다면 새로운 데이터 가용성을 위해 일반 파일 설명자 (경로를 사용하는 파일이 아닌)를 모니터링하는 방법은 무엇입니까? poll 이외의 다른 기능을 사용해야합니까? 또는 pollfd 플래그가 누락 되었습니까?

+0

[fstat] (http://linux.die.net/man/2/fstat)를 호출하고'EBADF'를 확인해야하지만 실제로'poll'의 반환 값을 살펴 보는 것이 도움이됩니다. 시스템 콜을 먼저! –

+0

'poll'은 일반 디스크 파일에서는 작동하지 않습니다. –

답변

4

일반 파일에 poll을 사용하여 변경 사항을 볼 수 없습니다. 그러나 몇 가지 다른 방법이 있습니다. 고전적인 접근법은 열린 파일 기술자와 정기적으로 fstat을 호출하고 반환 된 필드를 이전 필드 (특히 st_size)와 비교하는 것입니다. 현대적인 접근 방식은 파일 모니터링에 inotify(7)을 사용하는 것입니다. GNU 꼬리의 예 최신 버전이 방법을 사용하십시오 :

$ strace tail -f /tmp/foobar 
... 
open("/tmp/foobar", O_RDONLY)) = 3 
... 
inotify_init() = 4 
inotify_add_watch(4, "/tmp/foobar", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1 
... 
read(4, ... 

작동하는 방법에 대한 자세한 내용은 매뉴얼 페이지 inotify(7)를 참조하십시오.

관련 문제