개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.03.14 05:11

FFI::addr와 Ruby에 대한 이해

  • DP전문가 3일 전 2025.03.14 05:11
  • 4
    1
제가 Ruby에서 FFI::addr를 사용하여 메모리 주소를 얻어보려고 하는데, 이 메모리 주소는 실제로 Ruby의 메모리 주소인가요?

그리고 이 메모리 주소를 사용하여 다른 프로그램에서 접근할 수 있나요?

예를 들어, C나 C++ 프로그램에서 이 메모리 주소를 사용하여 Ruby의 메모리에서 데이터를 읽어올 수 있나요?

제가 이해한 바로는 FFI::addr는 Ruby의 메모리 주소를 얻어오는 메서드이지만, 실제로 Ruby의 메모리 주소가 아닌 Ruby의 데이터를 가리키는 포인터가 되는 것 같아요.

그렇다면, Ruby의 메모리 주소를 얻어오는 방법은 없나요?

또한, FFI::addr를 사용하여 다른 프로그램에서 접근할 수 있는 방법은 없나요?

제가 궁금한 점을 해결해 주시면 감사하겠습니다.

    댓글목록

    profile_image
    나우호스팅  3일 전



    FFI::addr는 Ruby의 메모리 주소를 얻어오는 메서드가 아닙니다. FFI::addr는 Ruby의 데이터를 가리키는 포인터를 반환합니다.

    Ruby의 메모리 주소를 직접 얻는 방법은 없습니다. Ruby는 가비지 컬렉션을 사용하기 때문에 메모리 주소가 변경될 수 있습니다.

    FFI::addr를 사용하여 다른 프로그램에서 접근할 수 있는 방법은 없습니다. FFI::addr는 Ruby의 데이터를 가리키는 포인터이기 때문에 다른 프로그램에서 접근할 수 없습니다.

    하지만, FFI::addr를 사용하여 다른 프로그램에서 접근할 수 있도록 하는 방법은 있습니다.

    1. FFI::addr를 사용하여 Ruby의 데이터를 가리키는 포인터를 얻습니다.
    2. 포인터를 사용하여 데이터를 읽거나 쓰는 함수를 작성합니다. (예: C나 C++ 프로그램에서)
    3. Ruby 프로그램에서 FFI::addr를 사용하여 포인터를 얻고, 포인터를 사용하여 데이터를 읽거나 쓰는 함수를 호출합니다.

    예를 들어, C 프로그램에서 FFI::addr를 사용하여 Ruby의 데이터를 읽는 예제입니다.

    #hostingforum.kr
    c
    
    #include 
    
    #include 
    
    
    
    void read_data(ffi_cif *cif, void *user_data, void **pargs) {
    
        int *addr = (int *)ffi_prep_args(cif, FFI_CIF_M32, 1, pargs);
    
        printf("%dn", *addr);
    
    }
    
    
    
    int main() {
    
        ffi_cif cif;
    
        ffi_type *arg_types[] = { &ffi_type_int };
    
        ffi_type *return_types[] = { &ffi_type_void };
    
    
    
        ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, return_types, arg_types);
    
    
    
        void *user_data = NULL;
    
        void *pargs[] = { NULL };
    
    
    
        ffi_call(&cif, FFI_FN(read_data), user_data, pargs);
    
    
    
        return 0;
    
    }
    
    


    Ruby 프로그램에서 FFI::addr를 사용하여 포인터를 얻고, 포인터를 사용하여 데이터를 읽는 함수를 호출하는 예제입니다.

    #hostingforum.kr
    ruby
    
    require 'ffi'
    
    
    
    module MyModule
    
      extend FFI::Library
    
      ffi_lib 'mylib'
    
    
    
      attach_function :read_data, [:int], :void
    
    end
    
    
    
    addr = FFI::MemoryPointer.new(:int)
    
    addr.write_int(10)
    
    
    
    MyModule.read_data(addr.address)
    
    


    이 예제에서는 C 프로그램에서 FFI::addr를 사용하여 Ruby의 데이터를 읽는 함수를 작성하고, Ruby 프로그램에서 FFI::addr를 사용하여 포인터를 얻고, 포인터를 사용하여 데이터를 읽는 함수를 호출합니다.

    2025-03-14 05:12

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 4,012건 / 50 페이지

검색

게시물 검색