문제

나는 파일 핸들처럼 보이지만 실제로는 I/O 리디렉션에 사용하기 위해 인메모리 버퍼로 뒷받침되는 것을 원합니다.어떻게 해야 하나요?

도움이 되었습니까?

해결책

컴파일러를 수정하지 않으면 불가능합니다.이는 Handle이 유형 클래스가 아닌 추상 데이터 유형이기 때문입니다.

다른 팁

저는 이것을 제공하는 "손잡이(knob)"라는 라이브러리를 작성했습니다.해킹].이를 사용하여 생성할 수 있습니다. Handles는 다음을 참조/수정합니다. ByteString:

import Data.ByteString (pack)
import Data.Knob
import System.IO

main = do
    knob <- newKnob (pack [])
    h <- newFileHandle knob "test.txt" WriteMode
    hPutStrLn h "Hello world!"
    hClose h
    bytes <- Data.Knob.getContents knob
    putStrLn ("Wrote bytes: " ++ show bytes)

C나 시스템 호출 측면에서 원하는 것을 표현할 수 있다면 Haskell의 FFI(Foreign Function Interface)를 사용할 수 있습니다.나는 mmap 사용을 제안하기 시작했지만, 다시 생각해보면 익명 옵션과 함께 사용하더라도 mmap이 잘못된 방식으로 매핑될 수 있다고 생각합니다.

haskell.org wiki에서 Haskell FFI에 대한 자세한 정보를 찾을 수 있습니다.

이는 불가능할 수도 있습니다. GHC, 적어도 모든 읽기/쓰기/탐색 작업에 사용되는 OS 파일 설명자를 갖기 위한 핸들이 필요한 것 같습니다.

보다 /libraries/base/IOBase.lhs GHC 소스에서.

OS의 도움을 받아 동일한 효과를 얻을 수 있습니다.임시 파일을 생성하고 여기에 핸들을 연결한 다음 I/O 리디렉션을 위해 파일을 메모리 매핑합니다.이렇게 하면 모든 핸들 I/O가 메모리 매핑된 섹션에 표시됩니다.

이것은 실제로 라이브러리 디자인의 버그이며 저 역시 짜증나는 부분입니다.나는 당신이 원하는 것을 하는 데 두 가지 접근 방식이 있다고 생각하는데, 어느 쪽도 별로 매력적이지 않습니다.

  1. 새로운 타입클래스를 생성하고, 현재 핸들을 그것의 인스턴스로 만들고, 메모리 내 데이터 작업을 수행하는 또 다른 인스턴스를 작성하고, 이 기능을 사용해야 하는 모든 프로그램을 변경하세요.아마도 이것은 가져오기만큼 간단할 것입니다. System.SIO (또는 당신이 부르고 싶은대로) 대신 System.IO.그러나 다음과 같은 라이브러리에서 사용자 정의 I/O 루틴을 사용하는 경우 Data.ByteString, 거기서 해야 할 일이 더 많습니다.

  2. 이를 지원하도록 확장하려면 I/O 라이브러리를 다시 작성하십시오.사소하고 많은 일이 아니지만 특별히 어려운 일도 아닐 것입니다.그러나 이 라이브러리가 없는 시스템과의 호환성 문제가 있습니다.

이 질문에 대한 현대적인 답변을 추가하려면 다음을 사용할 수 있습니다. createPipe ~에서 System.Process:

createPipe :: IO (Handle, Handle)

https://www.stackage.org/haddock/lts-10.3/process-1.6.1.0/System-Process.html#v:createPipe

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top