CTypes 및 Foreign을 사용하여 C 라이브러리에서 OCaml로 문자열 반환

lambda_foo

C 호출이 버퍼와 크기가 전달 될 것으로 예상하는 OCaml에서 네이티브 OSX 호출을 매핑하는 데 문제가 있습니다. CTypes 및 Foreign 사용에 대한 Real World OCaml의 예제를 통해 작업했지만이 경우는 다루지 않습니다. 아니면 적어도 내가 어떻게했는지는 분명하지 않습니다.

다음은 OCaml의 일부입니다.

open Core.Std
open Unix
open Ctypes
open Foreign

(* from /usr/include/libproc.h
  int proc_pidpath(int pid, void * buffer, uint32_t  buffersize);
*)
let proc_pidpath = foreign "proc_pidpath" (int @-> ptr void @-> int @-> returning int)

let () =
  let pid = Pid.to_int (Unix.getpid ()) in
  let buf = allocate string 255 in
  let path = proc_pidpath(pid, buf, 255) in
  printf "Pid: %i Path: %s\n" pid buf

전달할 버퍼를 어떻게 할당하고 proc_pidpath()Option 유형 (String 또는 Nil) 또는 문자열 만 반환하도록이 호출을 래핑하는 더 좋은 방법이 있습니까?

다니엘 번 즐리

이 질문은 이것으로 문제를 많이 공유 . 나는 당신이 그것을 보도록 권장합니다.

특정 문제에 대해 다음이 작동해야합니다 (사용하지 않으므로 Core일부 조정해야 할 수 있습니다 Unix.getpid. 추상 의 결과를 얻었 습니까?).

open Ctypes;;
open Foreign;;

module Proc : sig
  val pidpath : int -> string 
  (** @raise [Unix.Unix_error] in case of error *)
end = struct

  let pidpathinfo_maxsize = 1024 * 4 
  (* value of PROC_PIDPATHINFO_MAXSIZE. 
     N.B. this should not be hardcoded, see 1) in this answer 
     https://stackoverflow.com/questions/20851390 *)

  let char_array_as_string a len =    
  (* This function should soon no longer be required see:
     https://github.com/ocamllabs/ocaml-ctypes/pull/139 *)
    let b = Buffer.create len in 
    for i = 0 to len -1 do Buffer.add_char b (Array.get a i) done;
    Buffer.contents b

  let pidpath = 
    foreign ~check_errno:true "proc_pidpath"
      (int @-> ptr char @-> int @-> returning int)

  let pidpath pid =
    let path = Array.make char ~initial:'\x00' pidpathinfo_maxsize in 
    let len = pidpath pid (Array.start path) pidpathinfo_maxsize in
    char_array_as_string path len
end

let () =
  let print_pidpath pid = 
    try
      let path = Proc.pidpath pid in 
      Format.printf "Pid %d: %s@." pid path; 
    with Unix.Unix_error (e, _, _) -> 
      Format.eprintf "Pid %d: %s@." pid (Unix.error_message e)
  in
  print_pidpath (Unix.getpid ()); 
  print_pidpath (-10000 (* bogus *))

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C ++ 함수에서 문자열을 반환하는 TCL 라이브러리

분류에서Dev

정수를 인덱스로 사용하여 c에서 문자열을 반전하는 방법은 무엇입니까? (strlen () 또는 다른 문자열 라이브러리를 사용하지 않고)

분류에서Dev

ICU 및 Nana GUI 라이브러리를 사용하는 C ++-문자열 변환?

분류에서Dev

JavaScript를 사용하여 SharePoint의 문서 라이브러리간에 사용자 지정 열 값을 기반으로 파일 복사

분류에서Dev

node-hid 라이브러리를 사용하여 device.on () 메서드에서 데이터 응답을 문자열로 변환하는 방법

분류에서Dev

요청 라이브러리에서 사용할 Python 3에서 문자열을 유효한 wordpress URL로 변환

분류에서Dev

Python에서 문자열을 ctypes.c_ubyte 배열로 변환하는 효율적인 방법

분류에서Dev

DLL을 사용하여 C ++ 및 C # 간 문자열 교환

분류에서Dev

Regex 및 C #을 사용하여 문장 케이스로 변환

분류에서Dev

C #을 사용하여 웹 라이브러리에서 여러 XML로드

분류에서Dev

휴대용 라이브러리에서 문자열을 열거 형으로 변환

분류에서Dev

리버스 문자열 (Leetcode) C ++를 사용하여 새 문자열을 메서드로 반환 할 수없는 이유

분류에서Dev

Newtonsoft.Json 라이브러리를 사용하여 문자열을 C #을 사용하여 사용자 지정 개체로 역 직렬화하는 방법

분류에서Dev

graphene을 사용하여 Graphql에서 문자열로 삽입 된 사전 반환

분류에서Dev

Roslyn을 사용하여 C # 문자열 값을 이스케이프 된 문자열 리터럴로 변환

분류에서Dev

Swifty를 사용하여 Swift에서 JSON을 문자열로 반환

분류에서Dev

Entity Framework 모델이 전용 클래스 라이브러리에있을 때 C # 응용 프로그램에서 연결 문자열 및 데이터베이스 공급자를 정의하는 방법은 무엇입니까?

분류에서Dev

C ++ 용 Visual Studio에서 라이브러리에 대한 환경 및 경로를 설정하는 것을 관리 할 수 없습니다.

분류에서Dev

수학 라이브러리를 사용하여 C에서 소수점 3 자리로 반올림 된 1 라디안의 사인 표시

분류에서Dev

C #에서 일본어 문장을 가나로 변환하는 라이브러리?

분류에서Dev

fmt 라이브러리를 사용하여 vector <int>를 문자열로 변환

분류에서Dev

laravel을 사용하여 배열에서 문자열로 변환

분류에서Dev

ctypes를 사용하여 Python 문자열을 Fortran 서브 루틴에 전달

분류에서Dev

openssl에서 사용자 지정 반복 및 키 크기를 사용하여 CryptoJs3 + 라이브러리로 암호화 된 파일을 해독하는 방법

분류에서Dev

C에서 2D 배열을 사용하여 소문자를 대문자로 변환

분류에서Dev

C #에서 IBM i (iSeries)로 cwbx.dll 및 AS400System 클래스를 사용하여 라이브러리 목록을 설정하는 방법

분류에서Dev

Windows C ++-DeviceIoControl을 사용하여 제품 문자열 반환

분류에서Dev

`reverseStr ()`을 사용하여 C에서 문자열 반전

분류에서Dev

C ++에서 문자열의 문자 크기를 사용하여 문자열을 Char 배열로 변환하려면 어떻게해야합니까?

Related 관련 기사

  1. 1

    C ++ 함수에서 문자열을 반환하는 TCL 라이브러리

  2. 2

    정수를 인덱스로 사용하여 c에서 문자열을 반전하는 방법은 무엇입니까? (strlen () 또는 다른 문자열 라이브러리를 사용하지 않고)

  3. 3

    ICU 및 Nana GUI 라이브러리를 사용하는 C ++-문자열 변환?

  4. 4

    JavaScript를 사용하여 SharePoint의 문서 라이브러리간에 사용자 지정 열 값을 기반으로 파일 복사

  5. 5

    node-hid 라이브러리를 사용하여 device.on () 메서드에서 데이터 응답을 문자열로 변환하는 방법

  6. 6

    요청 라이브러리에서 사용할 Python 3에서 문자열을 유효한 wordpress URL로 변환

  7. 7

    Python에서 문자열을 ctypes.c_ubyte 배열로 변환하는 효율적인 방법

  8. 8

    DLL을 사용하여 C ++ 및 C # 간 문자열 교환

  9. 9

    Regex 및 C #을 사용하여 문장 케이스로 변환

  10. 10

    C #을 사용하여 웹 라이브러리에서 여러 XML로드

  11. 11

    휴대용 라이브러리에서 문자열을 열거 형으로 변환

  12. 12

    리버스 문자열 (Leetcode) C ++를 사용하여 새 문자열을 메서드로 반환 할 수없는 이유

  13. 13

    Newtonsoft.Json 라이브러리를 사용하여 문자열을 C #을 사용하여 사용자 지정 개체로 역 직렬화하는 방법

  14. 14

    graphene을 사용하여 Graphql에서 문자열로 삽입 된 사전 반환

  15. 15

    Roslyn을 사용하여 C # 문자열 값을 이스케이프 된 문자열 리터럴로 변환

  16. 16

    Swifty를 사용하여 Swift에서 JSON을 문자열로 반환

  17. 17

    Entity Framework 모델이 전용 클래스 라이브러리에있을 때 C # 응용 프로그램에서 연결 문자열 및 데이터베이스 공급자를 정의하는 방법은 무엇입니까?

  18. 18

    C ++ 용 Visual Studio에서 라이브러리에 대한 환경 및 경로를 설정하는 것을 관리 할 수 없습니다.

  19. 19

    수학 라이브러리를 사용하여 C에서 소수점 3 자리로 반올림 된 1 라디안의 사인 표시

  20. 20

    C #에서 일본어 문장을 가나로 변환하는 라이브러리?

  21. 21

    fmt 라이브러리를 사용하여 vector <int>를 문자열로 변환

  22. 22

    laravel을 사용하여 배열에서 문자열로 변환

  23. 23

    ctypes를 사용하여 Python 문자열을 Fortran 서브 루틴에 전달

  24. 24

    openssl에서 사용자 지정 반복 및 키 크기를 사용하여 CryptoJs3 + 라이브러리로 암호화 된 파일을 해독하는 방법

  25. 25

    C에서 2D 배열을 사용하여 소문자를 대문자로 변환

  26. 26

    C #에서 IBM i (iSeries)로 cwbx.dll 및 AS400System 클래스를 사용하여 라이브러리 목록을 설정하는 방법

  27. 27

    Windows C ++-DeviceIoControl을 사용하여 제품 문자열 반환

  28. 28

    `reverseStr ()`을 사용하여 C에서 문자열 반전

  29. 29

    C ++에서 문자열의 문자 크기를 사용하여 문자열을 Char 배열로 변환하려면 어떻게해야합니까?

뜨겁다태그

보관