Erlang 资料本来就非常少,我在网上和 git 都没有找到本书答案,所以打算自己写出来。
一来希望能帮到初学的朋友。
二来若答案有问题,望大家能提出来,共同进步^_^
git
地址 ProgrammingErlangAnswer
第一章 什么是并发 没有练习题。
第二章 Erlang 速览
% (1).启动并停止 Erlang
在终端输入 erl 启动 Erlang shell
在终端输入 Ctrl+c 选择 (a)bort 退出 shell
% (2).在 Erlang shell 里输入一些命令。不要忘了以句号和空白结束命令
1> X = 999.
2> X * 2.
3> io:format("hello world ~n")
% 对 hello.erl 做一些小小的改动。
% 在 shell 里编译并运行它们。
% 如果有错,中止 Erlang shell 并重启 shell。
-module(hello).
-export([start/1]).
start(X) ->
io:format("~s~n", [X]).
% (4).运行文件客户端和服务器代码。加入一个名为put_file的命令。你需要添加何种消息?学习如何查阅手册页。查阅手册页的 file 模块
client
-module(afile_client).
-export([ls/1, get_file/2, put_file/3]).
ls(Server) ->
Server ! {self(), list_dir}, % Pid ! Message 为发送消息
receive
{Server, FileList} ->
FileList
end.
get_file(Server, File) ->
Server ! {self(), {get_file, File}},
receive
{Server, Content} ->
Content
end.
% put_file 上传文件到 Server 上。
put_file(Server, File, NewName) ->
case file:read_file(File) of
% 注意不能直接发送 file:read_file 内容, file:read_file 返回的是一个元组,需要提取出来 Content 二进制信息。
{ok, Content} ->
Server ! {self(), {put_file, Content, NewName}},
receive
{Server, Result} ->
Result
end;
{error, Reason} ->
Reason
end.
server
-module(afile_server).
-export([start/1, loop/1]).
% 创建一个 Erlang 进程去执行 start
start(Dir) ->
spawn(afile_server, loop, [Dir]).
% 接受请求 1.目录 2.文件
% 回复请求
loop(Dir) ->
receive
{Client, list_dir} ->
Client ! {self(), file:list_dir(Dir)};
{Client, {get_file, File}} ->
Full = filename:join(Dir, File),
Client ! {self(), file:read_file(Full)};
{Client, {put_file, Content, NewName}} ->
Content,
% 注释为另一种方式,写入描述符 Fd。
%{Ret, FileFd} = file:open(NewName, [write, raw]),
%file:write(FileFd, Content),
%file:close(FileFd),
FullTwo = filename:join(Dir, NewName),
Ret = file:write_file(FullTwo, Content),
Client ! {self(), {Ret, FullTwo, Content}}
end,
loop(Dir).
运行截图