[erlang-questions] Linked-in drivers: output and control callbacks

Torben Hoffmann <>
Fri Dec 14 08:51:56 CET 2007


On Dec 13, 2007 10:41 PM, Vance Shipley <> wrote:

> On Thu, Dec 13, 2007 at 06:31:06PM +0000, Joel Reymont wrote:
> }  My understanding is that Port ! {self(),  {command,  Data}} triggers
> }  output whereas port_command(Port, Data)  triggers control.
> }
> }  When should control be used?
>
> Joel,
>
> Consider a driver for a communications channel.  You will
> send data down the channel as erlang messages to the port and
> receive data from the channel as erlang messages from the port.
> When sending the messages may be enqueued within the driver (see
> the erl_driver function driver_enq).  Received messages are
> handled through the process mailbox as normal.
>
> }  Are there any reasons to use control at all?
>
> The port_control/3 bif is synchronous, it delivers a response to
> a question or a result of a control operation directly.  You
> could simulate this by sending a message and waiting on a reply
> however the process would wait in a receive.  The port_control/3
> bif returns a value directly.  It is more like a driver "ioctl".


I take it that you ment that port_control/2  is synchronous and
port_control/3 is asynchronous?

Since port_control/3 is undocumented I have a question regarding it: will it
send a message when it is done or is it a
send-message-and-hope-life-is-swell type of call?

<snip>

Joel, you probably know this already but for those yet to encounter the port
beast: if the external program takes too long to return when called through
port_command/2 you will get a timeout so your code should probably take that
into account if you want it to be fault tolerant.

Cheers,
Torben
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20071214/c75a1dfe/attachment.html>


More information about the erlang-questions mailing list