2011-04-27 1 views
8

fseek()은 파이프에서 작동하지 않으므로 앞으로 검색을 시뮬레이션하는 방법이 있습니까? 순진한 접근법은 fread()을 사용하여 읽은 내용을 메모리 버퍼에 버리는 것입니다. 방대한 버퍼를 피하기위한 방대한 노력을 위해 버퍼의 일부만을 사용하여 최종 버퍼를 반복해서 사용합니다.파이프에서 읽을 때 포터블 C에서 앞으로 검색하는 방법

하지만이 방법이 유일한 방법입니까? 버퍼와 잠재적 인 다중 읽기를 피하는 다른 방법이 있습니까?

답변

4

예, 유일한 방법입니다. 나는 어딘가에 1k-8k 정도의 버퍼를 사용할 것이다. 훨씬 작아 질수록 읽기에 대한 시스템 오버 헤드가 발생하게되며, 훨씬 더 커지면 캐시에서 유용한 데이터를 제거하게됩니다.

5

입력이 동적으로 생성되기 때문에 (파이프에 저장되지 않음) 파이프에서 찾는 것이 이해가되지 않습니다. lseek 커널 시스템 호출은 파이프에 대해 구현되지 않습니다.

파이프는 본질적으로 제한된 고정 크기의 생산자 - 소비자 버퍼입니다. 가득 차면 소비자가 가장 오래된 데이터를 읽을 때까지 프로듀서가 일시 중지됩니다.

+0

@hippietrail : 버퍼 및 데이터를 건너 뛰는 여러 개의'read()'호출에 대한 우려가있는 경우 파이프를 전혀 사용하지 않는 것이 좋습니다. 소스가 디스크 파일에 쓰게되면, 파이프의 싱크 끝은'lseek()'패밀리 호출을 사용할 수 있습니다. – wallyk

+0

물론 동적으로 생성되는 출력은 알려진 형식입니다. – hippietrail

+0

@wallyk : 과거에 파이프를 사용했던 몇 가지 이유는 거대한 압축 아카이브의 XML 처리와 인터넷을 통해 XML이 도착하는 즉시 처리하기 때문입니다. 때로는 전체 데이터의 일부분 만 필요하며 압축되지 않은 모든 아카이브를 압축 할 수있는 디스크 공간이없는 경우가 있습니다. – hippietrail