2009-12-17 117 views
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 

回答

1

這最有可能是一個 「時機」 相關的問題。我懷疑它與「Eunit」如何執行其處理有關:「EUnit」在退出並因此終止所有進程之前可能沒有給您的模塊提供足夠的時間到close

+0

謝謝,我認爲修復它。我改變了所有的eunit文本,所以他們沒有完成,直到他們從驅動過程中收到了一條關閉的消息。 – HawaiianSpork 2009-12-17 16:21:51