Как завершить процесс с помощью функции цикла?

#erlang

#erlang

Вопрос:

Я пишу один модуль, в котором есть одна функция цикла, функция будет отправлять udp-пакет вечно. я отлаживаю программу в консоли erlang, я хочу знать, как закрыть сокет UDP? иначе erlang всегда будет выводить сообщение отладки в консоль. Спасибо!

 start() ->
  {ok, Sock} = gen_udp:open(0, []),
  send(Sock).

send(Sock) ->
  gen_udp:send(Sock, "127.0.0.1", 3211, "hello world"),
  timer:sleep(5000),
  send(Sock). 
  

Комментарии:

1. довольно сложно закрыть сокет, когда процесс не является «управляющим процессом» этого сокета. Модули gen_udp и gen_tcp могут содержать дополнительную информацию. Чтобы процесс закрыл его, он должен быть управляющим процессом этого сокета.

Ответ №1:

Здесь следует учитывать две вещи

  1. Если процесс является владельцем сокета.В этом случае вы можете напрямую использовать gen_udp:close(Sock).
  2. Если процесс не является владельцем сокета, тогда используйте gen_udp:controlling_process(Sock,Pid), где Pid — это идентификатор процесса нового владельца сокета. Теперь вы можете использовать gen_udp:close (Sock) из этого процесса. http://www.erlang.org/doc/man/gen_udp.html

Ответ №2:

Чтобы завершить процесс, вы можете

выход (Pid, kill).

если у вас есть цикл приема, вы всегда можете получить сообщение о завершении работы, которое существует в цикле.

получить завершение работы -> ничего.