[erlang-questions] who owns an open file

Torbjorn Tornkvist <>
Thu Mar 22 10:12:00 CET 2007


Mats Cronqvist wrote:
> Ulf Wiger (TN/EAB) wrote:
>> 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.
>>
>> 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).
>>
>> Finally, I wrote the following hacks in the shell:
>>
>> 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.
>>
>> #Fun<erl_eval.6.56006484>
>> 2> {ok,Fd} = file:open("foo.txt",[write]) <file:open(> . 
>> {ok,<0.80.0>}
>> 3> Owner(Fd).
>> <0.70.0>                                                             
>> 4> self().
>> <0.70.0>
>> 5> Filename = ets:lookup_element(file_io_servers,Fd,2).     
>> "foo.txt" 
>>
>>
>> There should be a better way.
>>
> 
>    trying to outdo me in the Horrible One-Liner Competition? Hah!
> 
>  
> [{process_info(Pid,monitors),ets:lookup(file_io_servers,Pid)}||[{name,"efile"},{links,[Pid]}|_]<-[erlang:port_info(P) 
> || P <- erlang:ports()]].
> 
>    mats

Beautiful! :-)

There is also, from the shell: C-c o
(shown to me by Magnus.F)

--Tobbe




More information about the erlang-questions mailing list