将文件描述符传递给使用spawn_link创建的进程

时间:2016-06-23 15:25:10

标签: erlang

我正在打开一个文件:

{ok, FD} = file:open(AcctFile, [binary, raw, read, {read_ahead, ?ACCT_READAHEAD_SZ}])

我打印FD并看到类似:{file_descriptor,prim_file,{#Port<0.421>,16}}的内容 我现在生成一个进程并将文件描述符传递给它:

spawn_link(fun() -> get_accts(AcctFile, FD, #bookmark{needsrefresh = true}) end).  

get_accts我打印FD,它与上面相同。

然而,此FD上的file:read_line和其他文件操作只是挂起(如果我在将它们传递给生成的进程之前在FD上调用它们,它们就会起作用。)发生了什么?

1 个答案:

答案 0 :(得分:2)

这是因为您以raw模式打开了文件。以raw模式打开的文件不能在不同的进程中使用(来自打开它的进程)。

来自Erlang file module documentation

  

原始

     
      
  • 。 。
  •   
  • 只有打开文件的Erlang进程才能使用它。
  •