<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7651.59">
<TITLE>who owns an open file</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->
<BR>

<P><FONT SIZE=2 FACE="Arial">I had reason to debug a system that ran out of file descriptors. It was easy enough to verify that the list of ports kept growing, and to extract the new ports in each poll iteration. More difficult - surprisingly - to figure out who owned the open files.</FONT></P>

<P><FONT SIZE=2 FACE="Arial">erlang:port_info(P) will give the pid of the controlling process. In this case, it's a file_io_server. It will be linked to the process which spawned it - this is always file_server. But file_server has no info of who ordered the opening of the file. The file_io_server does, but keeps it in a state variable, and doesn't respond to e.g. sys:get_status(Pid).</FONT></P>

<P><FONT SIZE=2 FACE="Arial">Finally, I wrote the following hacks in the shell:</FONT>
</P>

<P><FONT SIZE=2 FACE="Courier New">1> Owner = fun(P) -> {backtrace,Bin} = process_info(P,backtrace), Str = binary_to_list(Bin), {match,Start,Len} = regexp:match(Str,"#Port<.*>,.*}},"), [PidS|_] = string:tokens(string:sub_string(Str,Start+Len),"<>"), list_to_pid("<"++PidS++">") end.                                                    </FONT></P>

<P><FONT SIZE=2 FACE="Courier New">#Fun<erl_eval.6.56006484></FONT>

<BR><FONT SIZE=2 FACE="Courier New">2> {ok,Fd} = </FONT><A HREF="file:open("><U><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">file:open("foo.txt",[write])</FONT></U></A><FONT SIZE=2 FACE="Courier New">. </FONT>

<BR><FONT SIZE=2 FACE="Courier New">{ok,<0.80.0>}</FONT>

<BR><FONT SIZE=2 FACE="Courier New">3> Owner(Fd).</FONT>

<BR><FONT SIZE=2 FACE="Courier New"><0.70.0>                                                             </FONT>

<BR><FONT SIZE=2 FACE="Courier New">4> self().</FONT>

<BR><FONT SIZE=2 FACE="Courier New"><0.70.0></FONT>

<BR><FONT SIZE=2 FACE="Courier New">5> Filename = ets:lookup_element(file_io_servers,Fd,2).     </FONT>

<BR><FONT SIZE=2 FACE="Courier New">"foo.txt" </FONT>
</P>
<BR>

<P><FONT SIZE=2 FACE="Arial">There should be a better way.</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">BR,</FONT>

<BR><FONT SIZE=2 FACE="Arial">Ulf W</FONT>
</P>

</BODY>
</HTML>