[Rubby] Fiddle: 구조체 해제(Fiddle:Cstruct)
문헌을 잘 찾지 못해 정확한지 알 수 없어 거절했다.
예제: 시간 함수
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()
를 사용할 때 일반적으로 반환값을 사용하는데 이번 매개 변수에 대한 지침 교부가 초점이다.↩︎ Reference
이 문제에 관하여([Rubby] Fiddle: 구조체 해제(Fiddle:Cstruct)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/shimat/articles/c0ccf6d61792cc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)