《Erlang 程序设计》练习答案 -- 第二章 Erlang 速览

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).

运行截图

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值