Erlang усечение файла - PullRequest
       9

Erlang усечение файла

2 голосов
/ 17 декабря 2009

Я пытаюсь написать базовую программу на 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 Ответ

1 голос
/ 17 декабря 2009

Скорее всего, это проблема синхронизации. Я подозреваю, что это связано с тем, как «Eunit» выполняет свою обработку: «EUnit», вероятно, не дает вашему модулю достаточно времени для close перед выходом и тем самым завершением всех процессов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...