2010-08-02 2 views
-1

inotify로 프로그램을 작성하여 변경 사항을 파악하기 위해 루프에서 파일 변경을 확인하십시오. 하지만이 방법이 더 효과적 일 수 있다고 생각합니다. 누구나이 코드를 더 잘 쓸 수 있습니까?inotify로 프로그램 최적화

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <linux/inotify.h> 
#include <sys/select.h> 
#define EVENT_SIZE (sizeof (struct inotify_event)) 
#define EVENT_BUF_LEN  (1024 * (EVENT_SIZE + 16)) 
int event_check (int fd) 
{ 
    fd_set rfds; 
    FD_ZERO (&rfds); 
    FD_SET (fd, &rfds); 
    /* Wait until an event happens or we get interrupted 
    by a signal that we catch */ 
    return select (FD_SETSIZE, &rfds, NULL, NULL, NULL); 
    } 

int main() 
{ 
    int length, i = 0; 
    int fd; 
    int wd; 
while(1){ 
i=0; 
    fd = inotify_init(); 

    if (fd < 0) { 
    perror("inotify_init"); 
    } 

    wd = inotify_add_watch(fd, "/tmp/test", IN_CLOSE_WRITE); 
    if (event_check (fd) > 0) 
    { 
     char buffer[EVENT_BUF_LEN]; 
     int count = 0; 
     length = read(fd, buffer, EVENT_BUF_LEN); 
     if (length < 0) { 
      perror("read"); 
      } 
     while (i < length) {  struct inotify_event *event = (struct inotify_event *) &buffer[ i ]; 
      printf("New file %s Editted.\n", event->name); 
      i += EVENT_SIZE + event->len; 
      } 
    } 
} 
    inotify_rm_watch(fd, wd); 
    close(fd); 
} 
+2

코드가 더 좋다고 말하면 무슨 뜻인지 정의 할 수 있습니까? 어떤면에서 더 좋습니까? –

+0

더 잘 쓸 수 있습니까? 가능성이 매우 높다. 당신이 원했던 무엇인가 특별히 있습니까? –

+2

코드를 제대로 다시 열면 "더 좋게"됩니다. – bstpierre

답변

0

필자는 inotify를 한번도 사용하지 않았기 때문에 이것이 잘못되었을 수도 있지만 여기에 코드를 "개선"한다고 생각되는 몇 가지 변경 사항이 있습니다.

  1. 나는 루프 내부 inotify_init 또는 inotify_add_watch 중 하나를 넣어 어떤 이유가 있다고 생각하지 않습니다. 루프를 시작하기 전에이 초기화 작업을 한 번 수행하십시오.

  2. event_check 기능을 만든 이유가 확실하지 않습니다. 시간 제한을 지정하지 않고 단일 파일 설명자 만 사용하므로 읽기 기능을 사용하면 동일한 기능을 사용할 수 있습니다.

+1

또한 select에서 FD_SETSIZE를 제거하십시오. – Duck

1

난 당신이 하나 개의 프로그램에 대한 하나 inotify_init와 하나 개의 디렉토리에 대해 하나의 inotify_add_watch를 필요가 있다고 생각합니다. 작동하지 않는다고 말하는 "init 및 add_watch를 루프 바깥 쪽"버전에 붙여 넣을 수 있습니까?