Okay so while investigating this, i discovered something.
This code will hang forever no matter what. It doesn’t matter how much data
is written to the pipe, the data will never be read by Erlang/Elixir.
{:ok, file} = :file.open(path_to_fifo, [:read, :write, :binary])
{:ok, "hello world"} = :file.read(file, 11)
# in a different tab to `File.write(path_to_fifo, "hello world")`
This code however works fine. I suspect this is because the :raw option is a NIF now. (just a guess?)
# notice the `:raw` option.
{:ok, file} = :file.open(path_to_fifo, [:read, :write, :binary, :raw])
{:ok, "hello world"} = :file.read(file, 11)
# in a different tab to `File.write(path_to_fifo, "hello world")`
The only problem with opening in :raw mode is that i can’t use Task to call read/2 because the Task is not an owning process. I get the following error:
** (ErlangError) Erlang error: :not_on_controlling_process
:prim_file.get_fd_data/1
:prim_file.read/2
(elixir) lib/task/supervised.ex:89: Task.Supervised.do_apply/2
(elixir) lib/task/supervised.ex:38: Task.Supervised.reply/5
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
I guess this isn’t really an Elixir issue, but an Erlang one but any help would be appreciated.


















