2012-02-14 2 views
0

inotify를 사용하여 C/C++에서 여러 파일을 테일링하는 경우 파일의 끝에 읽을 때 경쟁 조건이 발생할 위험이 있습니까? 그러면 폴링을 시작하기 전에 파일에 기록됩니까? inotify (경쟁 조건?)를 사용하여 C/C++ (Linux)의 "tailing"다중 파일

while (true) { 
    struct pollfd pfd = { fd, POLLIN, 0 }; 
    int ret = poll(&pfd, 1, 30000); // timeout 30s 
    if (ret > 0) { 
    size_t len = read(fd, buf, sizeof(buf)); 

    for (size_t e = 0; e < len;) { 
     inotify_event *ev = reinterpret_cast<inotify_event*>(&buf[e]); 

     int i = 0; 
     while (wds[i] != ev->wd) { 
     ++i; 
     } 

     if (ev->mask & IN_MODIFY) { 
     FILE* f = ff[i]; 
     fseek(f, pos[i], SEEK_SET); 

     while (fgets(line[i]+offsets[i], MAX_LINE_LENGTH, f)) { 

는 설문 조사 기능은 때 파일이

을 수정 반환하지 :

코드의 관련 조각처럼 시작? 다음 순서가 발생하는 경우 어떤 일이 발생합니다

  1. 여론 조사 신호 파일은 내가가 시작
  2. 다음 파일이 다음
  3. 에 추가됩니다 파일의 마지막까지 읽어
  4. 에 추가되었습니다 반환 설문 조사

파일이 다시 추가 될 때까지 붙어있을 것입니까? inotify_add_watch 함수는 파일 이름 만 취하기 때문에 어디에서 "떠난"것인지 알지 못합니다.

+0

여기 C-ish 코드가 인상적입니다. 나는 거의 C로 버렸지 만,'reinterpret_cast'는 C++이 필사적으로 C가되기를 바랄 때 그것을 버린다. – Puppy

답변

1

귀하는 을 작성해야합니다. 통지를 작성한 후 파일의 끝에 읽으십시오. 그렇지 않으면 정확히이 경쟁 조건을 갖게됩니다. 알림을 받으면 전에 알림 시스템을 다시 작동시켜 파일을 읽은 후에 발생한 변경 사항을 알 수 있도록 파일을 읽어야합니다.

+0

나는 강조가 * *가 아니라 * must *에 속한다고 생각한다. 그러나 좋은 충고. –