最初に免責事項私はerlangを学んでいます。ここでは専門家ではありません。 ETSを使用していくつかの例を作成しているうちに、私は何かを見つけたが、私は理解していない(検索した後でも)。シェルの有無にかかわらずETSの異なる動作
私はその後、他のプロセスにTABLEIDを渡す私は
TableID = ets:new(tablename, [public])}
と公共ETSを作成するプロセスを持っています。私がこれを実行すると、モジュールがシェルを形成し、すべてがOKです。 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