2
我正在嘗試編寫一個基本的Erlang程序,該程序在一個進程中讀入一個文件並在另一個進程中寫入該文件。我發現有時輸出文件被截斷。Erlang文件截斷
例如我寫了eunit測試。如果我運行單個測試drive_test:write_file_test()輸出正確寫入。但運行drive_test:test()每次都會在不同位置截斷輸出文件。
我是否需要做一些特殊的事情來確保流程在關閉之前完成寫入?
drive.erl:
-module(drive).
-include("library.hrl").
-export([init/1]).
init(Drive) ->
loop(Drive).
loop(Drive) ->
receive
{write, Data} ->
write(Drive,Data),
loop(Drive);
close ->
close(Drive)
end.
write(Drive,Data) ->
%io:format("~p", [Data]),
Handler = Drive#drive.volume,
file:write(Handler, [Data]).
close(Drive) ->
Handler = Drive#drive.volume,
file:close(Handler),
io:format("closed ~w~n", [Drive]).
drive_test.erl
-module(drive_test).
-include_lib("eunit/include/eunit.hrl").
-include("library.hrl").
startupShutdown_test() ->
DrivePid = spawn(drive,init,[#drive{number=1}]),
DrivePid ! close.
write_basic_test() ->
{ok, F} =file:open("test/library/eunit.txt", write),
DrivePid = spawn(drive,init,[#drive{number=1,volume=F}]),
DrivePid ! {write, "Some Data"},
DrivePid ! close.
write_file_test() ->
{ok, Fin} = file:open("cathedral.pdf", read),
{ok, Fout} =file:open("test/library/eunit2.txt", write),
DrivePid = spawn(drive,init,[#drive{number=1,volume=Fout}]),
write_file(Fin, DrivePid),
DrivePid ! close.
write_file(F, DrivePid) ->
Rd = file:read(F, 256),
case Rd of
{ok, Data} ->
DrivePid ! {write, Data},
write_file(F, DrivePid);
eof -> file:close(F);
_ -> ?_assert(false)
end.
截斷的文件:
$ ls -l cathedral.pdf test/library/eunit2.txt
-rwx------+ 1 218879 Sep 16 22:21 cathedral.pdf
-rwxr-xr-x 1 60928 Dec 17 09:31 test/library/eunit2.txt
謝謝,我認爲修復它。我改變了所有的eunit文本,所以他們沒有完成,直到他們從驅動過程中收到了一條關閉的消息。 – HawaiianSpork 2009-12-17 16:21:51