<div dir="ltr"><div>Hello everybody.</div><div><br></div><div>I'm having a problem with the way prim_file deals with ports; hope you can suggest something.</div><div><br></div><div>I have a gen_server that handles requests to read files. The volume of requests is quite high, so I try to optimize everything I can. In particular, in the beginning I open a port by calling prim_file:open/1, and then use this port for all subsequent file operations.</div><div><br></div><div>I found that calling prim_file:read_file/2 (to read the entire file) causes no problems.</div><div>However calling prim_file:open/3 + prim_file:read/2 + prim_file:close/1 (in order to read a portion of a file) causes the port to close.</div><div><br></div><div>This can be reproduced like this:</div><div><br></div><div><div><font face="courier new, monospace">Eshell V5.10.4  (abort with ^G)</font></div><div><font face="courier new, monospace">1></font></div><div><font face="courier new, monospace">1> Filename = "/tmp/testfile".</font></div><div><font face="courier new, monospace">"/tmp/testfile"</font></div><div><font face="courier new, monospace">2> os:cmd("touch /tmp/testfile").</font></div><div><font face="courier new, monospace">[]</font></div><div><font face="courier new, monospace">3> {ok, Port} = prim_file:open([binary]).</font></div><div><font face="courier new, monospace">{ok,#Port<0.611>}</font></div><div><font face="courier new, monospace">4> prim_file:read_file(Port, Filename).</font></div><div><font face="courier new, monospace">{ok,<<>>}</font></div><div><font face="courier new, monospace">5> prim_file:read_file(Port, Filename).</font></div><div><font face="courier new, monospace">{ok,<<>>}</font></div><div><span style="font-family:'courier new',monospace">6> {ok, Fd} = prim_file:open(Port, Filename, [read, binary]).</span><br></div><div><font face="courier new, monospace">{ok,{file_descriptor,prim_file,{#Port<0.611>,11}}}</font></div><div><font face="courier new, monospace">7> prim_file:read(Fd, 100).</font></div><div><font face="courier new, monospace">eof</font></div><div><font face="courier new, monospace">8> prim_file:close(Fd).</font></div><div><font face="courier new, monospace">ok</font></div><div><font face="courier new, monospace">9> prim_file:read_file(Port, Filename).</font></div><div><font face="courier new, monospace">{error,einval}</font></div><div><font face="courier new, monospace">10></font></div></div><div><br></div><div>The reason for this behavior is prim_file:close/1 which in addition to issuing a driver command "file close" also closes the port.</div><div><br></div><div>This looks counterintuitive to me: prim_file:open/3 did not open the port, so why prim_file:close/1 should close it?</div><div><br></div><div>Can somebody provide some insight into this issue, and/or a workaround?</div><div><br></div><div>Thank you,</div><div>Alex</div><div><br></div></div>