[erlang-questions] port_close/1 problem (Serge Aleynikov)

Serge Aleynikov saleyn@REDACTED
Thu Nov 1 14:08:32 CET 2007

Thanks for the suggestion, I'll take a look at the odbc code.

Supervisor_bridge behavior is what I am currently using to ensure proper 
cleanup of the managed port and other resources.


Ingela Anderton Andin wrote:
> Hi!
> A suggestion is to solve this little problem the way that the 
> odbc-port-program does.
> The odbc port-program has two threads one supervisor thread and one 
> thread that does
> the actual work.  Both  threads set up an ordinary socket to the erlang 
> process and then
> communicates through them. The supervisor thread waits for a message 
> from erlang and
> if it gets it it will exit the c-process. So the erlang process can at 
> any time for any reason it sees fit
> terminate the c-process. Of course there are other reasons why  the odbc 
> port-program does want to use sockets and not at all use the pipe to 
> communicate with erlang, except initially. (These are not relevant here,
> let me just say it has to do with handling all sorts of ill behaved 
> odbc-drivers)
> Another suggestion could be to try to use the supervisor_bridge 
> functionality, I have never had the chance
> to use it in reality so I have no hands on knowledge of it, but it could 
> be worth considering.
> Regards Ingela  - OTP team
>> I reread this email and realized that I forgot to mention the fact 
>> that in my understanding port_close/1 merely closes its end of the 
>> pipe used to communicate with the port process.  So in this case if 
>> the running port program is in the middle of a blocking call it won't 
>> detect the closing of the file descriptor it uses to communicate with 
>> Erlang and will continue running.  So if I wanted to kill that port by 
>> sending an appropriate signal from Erlang how can I determine the OS 
>> pid of the port?
>> The obvious answer is to communicate that OS pid back to Erlang 
>> through the pipe, but in this particular case it takes over two to 
>> three minutes before the port loads all components and starts reading 
>> its end of the pipe, and I'd like to be able to kill it prior to that.
>> Any suggestions

More information about the erlang-questions mailing list