codecamp

Elixir 进程和群首领

你可能已经注意到了File.open/2返回了一个元组形如{:ok, pid}:
iex> {:ok, file} = File.open "hello", [:write]
{:ok, #PID<0.47.0>}

这是因为IO模块正在处理进程(参见Elixir 进程).当你运行IO.write(pid, binary)时,IO模块将根据pid发送一个所需操作的信息给进程.让我们来看看自己设定进程时会发生什么:

iex> pid = spawn fn ->
...>  receive do: (msg -> IO.inspect msg)
...> end
#PID<0.57.0>
iex> IO.write(pid, "hello")
{:io_request, #PID<0.41.0>, #Reference<0.0.8.91>, {:put_chars, :unicode, "hello"}}
** (ErlangError) erlang error: :terminated

IO.write/2之后,我们看到IO模块发送了的请求(一个四元素元组)打印了出来.之后,我们看到它失败了,原因是我们没有提供IO模块期待的某种结果.

StringIO模块提供了IO设备信息中字符串的操作:

iex> {:ok, pid} = StringIO.open("hello")
{:ok, #PID<0.43.0>}
iex> IO.read(pid, 2)
"he"

通过用进程模型化了的IO设备,Erlang虚拟机允许同一个网络中的不同节点可以交换文件进程,以此来在不同的节点间读写文件.在所有IO设备之中,有一个与众不同的进程:群首领.

当你写入到:stdio,你实际上是在发送一个信息给群首领,它会写入到标准输出文件中:

iex> IO.puts :stdio, "hello"
hello
:ok
iex> IO.puts Process.group_leader, "hello"
hello
:ok

群首领可以由单个进程配置而成,并可用于不同的情形.例如,当在远程终端中执行代码时,它可以保证在远程节点中的信息被重定向并打印在触发请求的终端中.

Elixir Path模块
Elixir iodata和chardata
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Elixir 基本操作符

Elixir 二进制,字符串和字符列表

Elixir 类型规格与行为

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }