2017-10-10 5 views
1

tail (posix 시스템 호출) 버전을 구현해야했습니다. 나는 lseekpread을 사용하여 그것을했다. (필자는 파일의 끝에 도달 한 다음 올바른 오프셋 위치를 검색 한 다음이 위치에서 프리드로 읽은 다음 파일의 끝까지 stdout에 씁니다). 하지만 이제는 lseek없이 꼬리의 다른 버전을 구현해야합니다. 질문은 다음과 같습니다 :파일에 꼬리표를 붙이는 대신에 (Posix)

"파일이 lseek에 대한 호출을 지원하지 않으면 이전 버전이 작동하지 않습니다. 이런 경우가 있음을 알려주십시오. 구현하지 않을 솔루션을 제안하여이 문제를 해결하십시오." 당신은 아이디어가있는 경우

우리가 lseek없이 할 수있는 방법을 이해하지 않습니다 ...

것은, 나는 매우 감사하게 될 것입니다 :)

대단히 감사합니다!

+1

필요한 위치까지 읽은 다음 읽은 데이터를 버립니다. –

답변

2

이 경우에 해당하는 경우가 있습니다.

그 점을 감안하여 설명서 페이지에서 lseek이 반환 할 수있는 오류를 확인합니다.

EBADF fd는 열린 파일 설명자가 아닙니다.

사용 오류. 관련 없음.

EINVAL은 유효하지 않습니다. 또는 결과 파일 오프셋이 음수이거나 탐색 가능 장치의 끝을 초과합니다.

사용 오류. 관련 없음.

EOVERFLOW 결과 파일 오프셋은 off_t로 표현할 수 없습니다.

매우 큰 파일. 관련된.

ESPIPE fd는 파이프, 소켓 또는 FIFO와 연결됩니다.

관련 있습니다.

ENXIO는 SEEK_DATA 또는 SEEK_HOLE이고 현재 파일 오프셋은 파일 끝을 벗어납니다.

사용 오류. 관련 없음.

파일이 축소되었습니다. 관련된.


는이 문제를 해결하기 위해 (당신이 구현되지 않습니다) 솔루션을 제안한다.
  • EOVERFLOW

lseek64는 전환에 의해 해결 될 수있다. 이렇게하면 최대 8b 크기의 파일로 작업 할 수 있습니다. (즉 8,589,934,592 지브입니다.)

  • ESPIPE

    파이프, 소켓 및 FIFO를 실제로 훨씬 더 쉽게 일반 파일보다 꼬리. 이 중 하나에서 읽을 때 read은 끝까지 도달하지 못하면 더 많은 데이터를 기다리는 것을 차단합니다. 일반 파일에 사용되는 복잡한 알고리즘을 채택 할 이유가 없습니다. 루프에서 read을 간단하게 호출 할 수 있습니다. 파일을 미행

  • ENXIO

    본질적으로 만 수정 꼬리중인 파일이 새로운 라인의 추기입니다에 만들어지고 가정. 이 오류는 다른 종류의 변경이 파일에 수행되었음을 나타냅니다. 이것은 피할 수없는 오류입니다.

    tail은 경고 (file truncated)를 내고 새 EOF에서 꼬리로 이동합니다.

  • 0

    끝에 도달 할 때까지 데이터를 읽고 버리고 링 버퍼의 마지막 두 줄을 유지합니다.