처음으로 면책 조항 나는 erlang을 배우고 있습니다. 여기 전문가가 아닙니다. ETS를 사용하여 몇 가지 예를 만들었는데 뭔가 이해가되지 않았습니다 (검색 한 후에도).쉘이 있거나없는 ETS의 다른 작동
난 난 후 다른 프로세스 테이블 ID를 전달
TableID = ets:new(tablename, [public])}
와 공용 ETS를 생성하는 방법이있다. 이 작업을 수행 할 때 모듈이 쉘을 형성합니다. 모두 괜찮습니다. erl -noshell -s ...와 똑같은 모듈을 실행할 때 또는 -noshell 옵션을 지정하지 않아도 동일한 모듈을 실행할 때 오류가 발생합니다. 오류가 계속 발생합니다 : 표적이 존재하지 않는 것처럼 badarg. ID가 제대로 전달되지만 테이블은 실제로 비공개로 작동합니다!
모듈을 쉘에서 또는 대화 형으로 실행하는 것과 다른 점이 있습니까?
감사
는 내가하려고 사용하고있는 코드의 예를 추가하고 문제를 디버깅하고있다. 그것이 더 큰 소프트웨어의 조각이기 때문에 (그리고 그것은 기본적으로 뼈를 벗겨서 문제를 발견합니다), 이해하기 어려울 수도 있습니다.
-record(loop_state, {
commands
}).
start() ->
LoopState = #loop_state{commands = ets:new(commands, [public])},
tcpserver_otp_backend:start(?MODULE, 7000, {?MODULE, loop}, LoopState).
loop(Socket, LoopState = #loop_state{commands = Commands}) ->
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
% the call below fails, no error generated, AND only in non interactive shell
A = newCommand(Commands, Data),
gen_tcp:send(Socket, A),
loop(Socket, LoopState);
{error, closed} ->
ok
end.
newCommand(CommandTableId, Command) ->
case ets:lookup(CommandTableId,Command) of
[] ->
_A = ets:insert(CommandTableId, {Command, 1}),
<<1, "new", "1">>; % used for testing
_ ->
<<1, "old", "1">> % used for testing
end.
"불쾌감을주는 명령"을 제거하면 : 룩업은 모든 대화식 셸에서 다시 작동합니다.
오류 상황을 재현하기 위해 관련 코드를 게시 할 수 있습니까? –
완료, 내가 잘못하고있는 부분을 이해하려고 노력하면서 사용하고있는 부분 만 남겨 두었습니다. – Francesco