[Rubby] Fiddle: 구조체 해제(Fiddle:Cstruct)

이것은 Ruby에서 C 라이브러리를 호출할 때 사용된fiddle에 관한 글입니다.구조 포인터를 사용하는 매개변수의 단계를 유지합니다.
문헌을 잘 찾지 못해 정확한지 알 수 없어 거절했다.

예제: 시간 함수


time는 Unix시간(Epocks)을 획득한 C의 표준 라이브러리의 함수다.
#include <time.h>

time_t time( time_t *t );
이곳time_t은 최근 몇 년 동안long(8바이트 기호가 있는 정수)의 별명으로 구조체가 과장되었다고 하지만 파라미터의 지침에 결과를 입력할 수 있는 간단한 함수time_t를 생각하지 못했기 때문에 구조체로 예제를 삼았다.[1]

fiddle/import


fiddle/import에서 루비에서 타임을 호출하는 코드를 써 보세요.time_t는 1개의 롱 값을 가진 구조로 정의했다.
시험 환경은 루비의 Docker 컨테이너ruby:3.1-slim
require 'fiddle/import'

module LibC
    extend Fiddle::Importer
    dlload 'libc.so.6'
    typealias "time_t", "long"
    extern 'time_t time(time_t *t)'
    Time_t = struct(['long value'])
end

time_ptr = LibC::Time_t.malloc
LibC.time(time_ptr)

p time_ptr.value  # time()によるエポック秒
p Time.now.to_i   # Rubyで答え合わせ
결과 예.
1642258051
1642258051

free


이상은 동작LibC::Time_t.malloc하고 나니 프리가 없어 차분하지 못하다.Fiddle::CStruct#malloc가 만든 분야free의 문헌은 아직 만나지 못했지만, 아래와 같이 하면 좋은 것 같다.
require 'fiddle/import'

module LibC
    extend Fiddle::Importer
    dlload 'libc.so.6'
    typealias "time_t", "long"
    extern 'time_t time(time_t *t)'
    Time_t = struct(['long value'])
end

time_ptr = nil
begin
    time_ptr = LibC::Time_t.malloc
    LibC.time(time_ptr)
    p time_ptr.value
ensure
    Fiddle.free(time_ptr.to_i) if time_ptr
end
malloc를 명확하게 부르면free지, 그렇지 않으면 필요없다.Ruby 객체가 먼저 있는 경우(예: Fiddle::Pointer[str], Fiddle::Closure::BlockCaller 등)에 free가 있으면 신호가 표시됩니다.
각주time()를 사용할 때 일반적으로 반환값을 사용하는데 이번 매개 변수에 대한 지침 교부가 초점이다.↩︎

좋은 웹페이지 즐겨찾기