how to kill a port's external process?
Luke Gorrie
luke@REDACTED
Thu Aug 9 23:23:27 CEST 2001
Luke Gorrie <luke@REDACTED> writes:
> I think a really nice and manly way to kill external ports would be to
> hack the "spawn driver" so that Erlang could make a driver ioctl to
> send a signal to a spawned program.
I couldn't resist and hacked in support for doing kill(2) on port
programs. I don't know if the approach is unwise for some reason but
it seems to work nicely.
The interface is a "spawn_drv" module in the kernel application with
these functions:
%% close_output(Port) -> ok | {error, Reason}
%%
%% Close the pipe from Erlang to the port's stdin
%% send_signal(Port, Signal) -> ok | {error, Reason}
%% Signal = hup | kill | term
%%
%% Send a Unix signal to the port with kill(2)
I was lazy and just defined 3 signals, but it's easy to add more.
Example:
1> P = erlang:open_port({spawn, "/bin/cat"}, [exit_status]).
#Port<0.7>
2> flush().
ok
3> spawn_drv:send_signal(P, kill).
ok
4> flush().
Shell got {#Port<0.7>,{exit_status,137}}
ok
Patch against R7B-3 attached, I hope I built it properly.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: spawndrv.patch
Type: text/x-patch
Size: 5842 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20010809/3dcda4aa/attachment.bin>
More information about the erlang-questions
mailing list