erlang例項 los簡單實現

2021-04-27 13:52:27 字數 2803 閱讀 2767

最近看了《erlang程式設計》,好書,翻譯的也不錯,兩天時間,基本讀完(我的習慣總是先快速讀完一本書再回過頭,一邊練習一邊翻閱),正試著學習編寫erlang的例子。joe在網上(http://erlang.org/examples/examples-2.0.html)給了乙個簡單系統(sos)的例子,可惜我太笨,怎麼都沒跑成功,又缺少專研的韌勁去弄清楚為什麼,所以乾脆決定自己寫乙個簡單的例子。

這個簡單的例子的基本思想就是首先,啟動乙個io程序負責io的讀寫工作(體現一切皆程序的思想,並且資料也應該是屬於程序的,io就是io程序的私有資料),再啟動乙個shell負責讀寫和執行使用者的命令(不過,目前的實現只是從標準輸入讀入輸入並顯示到標準輸出,呵呵,剛起步,以後會慢慢完善)。

los的主檔案是los.erl,其模組宣告如下:

-module(los).

-export([

boot/0,

make_scripts/0,

read/0,

write/1 ]).

呵呵,比較簡單,boot/0函式啟動los,read/0、write/1從標準輸入輸出讀寫資料;至於make_scripts/0,目前還沒用到,從joe的sos拷貝過來的,等研究清楚了啟動指令碼再考慮使用吧。

啟動los也很簡單,首先啟動erl shell,執行los:boot()就完成啟動:

1> los:boot().

los booted!

los_sh started!

los>

1.boot/0的工作就是啟動io服務程序,然後啟動shell等待使用者輸入:

boot() ->

start_io(),

write("los booted!~n"),

los_sh:run(),

write("los goodbye!~n").

2.start_io例程呼叫make_global例程來建立服務,其實現如下:

start_io() ->

make_global(io, fun io_loop/0).

3.make_global例程實現如下:

make_global(name, fun) ->

case whereis(name) of

undefined ->

self = self(),

pid = spawn(fun() ->

make_global(self,name,fun)

end),

receive

->

pidend;

pid ->

pidend.

make_global首先判斷name是否已經註冊,沒有註冊,則呼叫spawn函式新建乙個程序,並返回pid,如果已經註冊,直接返回pid。

真正註冊程序的例程是make_global/3,其**如下:

make_global(pid, name, fun) ->

case register(name, self()) of

->

pid ! ;

pid ! ,

fun()

end.

4.boot有兩個write呼叫,是los提供的系統級函式。write例程的實現如下:

write(str) ->

= rpc(io, ),

case reply of 

succeed -> succeed;

_ -> failue

end.

write例程就是呼叫rpc向io程序傳送寫的訊息和要寫的資料,io會將寫的狀態返回給當前程序,rpc就是向io程序傳送訊息並返回訊息。

5.rpc例程的實現如下:

rpc(name, q) -> 

name ! ,

receive     

->

reply;

->

exit(why)

end.

6.los還提供了read函式:

read() ->

= rpc(io, read),

data.

read函式將讀到的資料傳遞給呼叫者。

呵呵,los還是很簡單的,需要注意的大概就是read和write的訊息格式。

下面是los_sh模組,很簡單:

-module(los_sh).

-export([run/0]).

run() ->

los:write("los_sh started!~n"),

loop().

loop() ->

data = los:read(),

case lists:member(, [,,,]) of 

true -> los:write("los_sh quit!~n");

false -> los:write(data),

loop()

end.

shell就是簡單的呼叫read和write讀取和顯示使用者的輸入,這並不是真正意義上的shell,下面正試著編寫一些簡單的命令,能夠在los中執行,對系統做一些檔案的操作。

乙個比較有意思的問題是,如果將模組los_sh的名稱改為shell,並編譯生成shell.beam,那麼啟動erl會出現問題,有乙個很長的錯誤列表(我並沒有記錄錯誤日誌,不過很容易實驗)。

我猜想erlang的shell會尋找類似shell.beam之類的檔案吧,還沒有細研究過,有哪位高人知道的,希望不吝賜教。

超簡單的Erlang複數實現

超簡單的複數的erlang實現 參見 http www.trapexit.org complex numbers module complex export make 2,is complex 1,add 2,sub 2,mult 2,divide 2,get real 1,get imaginar...

Erlang簡單介紹整理

最近在看 七周七語言 適當了解一些c語言家族以外的程式語言也很有意思,下面記錄一下各個語言的語法特點。一,erl開啟erlang互動命令列 用百分號注釋,語句用句號標誌結束 變數必須是大寫字母開頭,只可賦值一次 name ciaos ciaos name.ciaos 符號首字母小寫 color re...

erlang的簡單編譯

首先我們先來建立乙個test的資料夾,然後再該資料夾下建立這樣幾個資料夾 這些在以後都是用的到的,檔案結構不需要更多複述!目的是將我們所有的編譯好的beam檔案放到ebin中以便我們進行操作 我們在script資料夾下新建乙個檔案格式的emakefile檔案,然後我們在src內新建兩個資料夾modu...