2016-12-14 5 views
1

에 의해 놓친 나는이 다음 코드 : 그것을 로그 파일에서 라인별로 라인을 읽은 후 작성하도록되어는 fgets - 라인는 fgets

static int const max_len = 1000; 
FILE* m_in_log = NULL; 
FILE* m_log = NULL; 
... 

... 


bool readLine(char* line, int max_len) 
    if(!fgets(line, max_len, m_in_log)) { 
     return false; 
    } 

    fputs(line, m_log); 
    fflush(m_log); 
    return true; 
} 

(cpp14), 등 다른 로그 파일에 있습니다.

리눅스에서 실행되는 복잡한 다중 스레드 시스템의 한 부분이며 m_in_log 입력은 FIFO입니다.

가정하자 m_in_log에 포함 된 다음 줄 :

AAA

BBB

CCC

DDD이 코드를 여러 번 실행하면

, 뭔가는 라인이 골대를 벗어났습니다

EEE

하지만 출력 로그 파일 난 단지

EEE

의미는 fgets가 중간에 3 개 라인을 읽는 놓친

AAA를 참조 (나는 알고 이 라인이 FIFO로 보내 졌기 때문에 FIFO에서 다른 파일로 tee을 보내고이 파일에서 모든 5 라인 s는 쓰여진다).

은 (운이없이) 몇 시간 동안이 문제를 고민 한 후 나는 std 방법을 사용하기로 결정 :

fgets => std::fgets 

fputs => std::fputs 

fflush => std::fflush 

을하고 그것을 해결하는 문제처럼 보인다.

std 방법으로이 문제를 해결할 수있는 이유를 설명해주세요.

+0

줄을 버리는 '티'과정이 아니라는 것을 어떻게 아시나요? –

+0

나는 그것에 대해 생각하지만, 또한 표준을 사용하여 티를 사용합니다 : : fgets –

+0

당신은 멀티 쓰레딩 언급, 거기에 로그 읽기/쓰기 동시 액세스 무엇입니까? 그렇지 않다면 fgetc/fputc를 사용하여 개별 문자를 읽으면 어떻게되는지 확인하십시오. DOS/UNIX 스타일의 줄 끝이 혼합되어있는 줄 끝 문제가있을 수도 있습니다. –

답변

0

Remy Lebeau가 제안했듯이 fgetsstd::fgets 사이에는 실제로 차이가 없으며 ~ 012 시간 동안 std::fgets 코드를 실행 한 후에 문제가 재현되었습니다.

그래서 나는 다른 곳에서 문제를 찾아야한다고 생각합니다.

감사합니다.