终止连接到erlang的进程';s端口

终止连接到erlang的进程';s端口,erlang,Erlang,我想写一个某种类型的管理器,我试图实现关闭外部程序的功能。外部进程通过端口连接到erlang代码。我不知道如何通过发送信号或其他方式关闭这个程序。关闭端口不是一个解决方案,因为我已经检查过很多程序没有在SIGPIPE上退出。你知道怎么做吗?你可以用 {os_pid, OsPid} = erlang:port_info(Port, os_pid). 要在操作系统中获得进程的pid(请参阅-我想您可能需要一个最新版本的Erlang才能将其包括在内,我认为apt get on Ubuntu12.0

我想写一个某种类型的管理器,我试图实现关闭外部程序的功能。外部进程通过端口连接到erlang代码。我不知道如何通过发送信号或其他方式关闭这个程序。关闭端口不是一个解决方案,因为我已经检查过很多程序没有在SIGPIPE上退出。你知道怎么做吗?

你可以用

{os_pid, OsPid} = erlang:port_info(Port, os_pid). 
要在操作系统中获得进程的pid(请参阅-我想您可能需要一个最新版本的Erlang才能将其包括在内,我认为apt get on Ubuntu12.04安装的版本还不够新,我知道R15B02已经安装了它),然后

os:cmd(io_lib:format("kill -9 ~p", [OsPid])).

杀死它()。

如果杀死链接的erlang进程,则可以杀死外部进程。这样做:

-module(portest).
-export([start/1, init/1, kill/0]).

start(ExtPrg) ->
   spawn(?MODULE, init, [ExtPrg]).

init(ExtPrg) ->
   process_flag(trap_exit, true),
   Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
   register(extport, self()),
   loop(Port).

kill() ->
   exit(whereis(extport), kill).

但您不能终止用IO读取阻塞的外部进程。

它在同一台机器上吗?你有PID吗?它对我有用,但是你能解释一下为什么你发送杀戮信号吗?这只是一个例子,或者有一些原因需要以这种方式完成进程?您询问了如何终止进程:)您还可以使用erlang:port_命令/2通过端口向进程发送消息,并告诉它轻轻停止。