erl_driver에 대해 the tutorial에서 첫 번째 ErlDrvPort
개체의 출처는 알 수 없습니다. libusb-1.0을 erlang에서 사용하기 위해 포장하려고합니다. 모든 인덱스 메소드에 대해 API에 ErlDrvEntry
으로 설명 된 위치는 없습니다. 포트를 열려면 어떻게하나요?erl_driver에서 포트를 나열하고 검사 할 올바른 위치는 무엇입니까
답변
일반적으로 erlang:open_port/2
function을 사용하여 첫 번째 포트를 얻습니다. 사용 방법은 질문에 연결된 the tutorial 섹션 6.2의 코드 예에 나와 있습니다.
NIF는 ErlangVM 전체를 충돌시킬 수 있기 때문에 더욱 위험합니다. 정말로 짧은 테스트를 거친 코드의 경우 좋은 ieda 일 수 있습니다. 전체 라이브러리를 래핑하려면 포트를 사용하는 것이 좋습니다. – tkowal
NIF는 고립 된 기능을위한 좋은 도구 인 것 같습니다. 일부 계산을 더 빨리 수행해야하는 경우와 같습니다. – lonelyelk
Nifty에는 별도의 노드에서로드 된 nif를 실행하는 "저장 실행"모드가 있습니다. 라이브러리가 충돌하면 분리 된 노드 만 충돌합니다. 이것은 또한 nif 호출을 차단하는 문제를 해결합니다. (분리 된 노드 만 차단됩니다.) [관련 Nifty Tutorial 페이지] (http://parapluu.github.io/nifty/tutorial5/) –
'driver_entry'내부에서 하드 코드하는 것처럼 보입니다. 이 줄은 : ""example_drv ", \t \t/* char * driver_name, open_port에 대한 인수 * /' – lonelyelk
[Documentation] (http://www.erlang.org/documentation/doc-5.6/erts-5.6/doc/) html/driver_entry.html # extended_marker)는 덜 구체적입니다 :'char * driver_name;/* 이름이 open_port XXX에서 명령으로 제공 되었습니까? * /'. ** XXX? ** – lonelyelk
드라이버 항목의 해당 문자열은 드라이버의 이름입니다. [enm, Erlang nanomsg 드라이버] (https://github.com/basho/enm)와 같이 최근에 구현 된 드라이버를 살펴 보는 것이 도움이 될 수 있습니다. 예를 들어 [enm.erl lines 340-349] (https://github.com/basho/enm/blob/master/src/enm.erl#L340-L349)는 ['erl_ddll']을 사용합니다 (http : // erlang.org/doc/man/erl_ddll.html)을 사용하여 드라이버 공유 라이브러리를로드 한 다음 [enm.erl line 443] (https://github.com/basho/enm/blob/master/src/enm.erl # L443)는'open_port'를 호출하여 드라이버에게 새로운 포트를 요청합니다. (이 줄 번호는 enm 커밋 65f278a를 기반으로합니다.) –