Процесс и TCPSocket не закрываются должным образом в кристалле - PullRequest
1 голос
/ 18 июня 2019

Я создаю tcp сервер, который принимает все соединения и выполняет входящие данные, имеет командную строку, но когда я посылаю «выход» в tcpsocket, процесс и сокет не закрываются должным образом

# main.cr

require "socket"

PORT = 2022

def handle_connection(socket)
  Process.run("/bin/sh", input: socket, output: socket, error: socket)
end

server = TCPServer.new(PORT)

loop do
  if socket = server.accept?
    spawn handle_connection(socket)
  else
    break
  end
end

например, следующий код работает нормально, после отправки «exit» в STDIN оболочка завершается, выводится «завершение процесса» и закрытие программы

channel = Channel(Nil).new

spawn do
  Process.run("/bin/sh", input: STDIN, output: STDOUT, error: STDERR)
  puts "process ending"
  channel.send(nil)
end

channel.receive

для отладки. Я также тестировал этот кодно «завершение процесса» никогда не печаталось до тех пор, пока я вручную не закрою сокет tcp

# main.cr

require "socket"

PORT = 2022

def handle_connection(socket)
  Process.run("/bin/sh", input: socket, output: socket, error: socket)
  puts "process ending"
end

server = TCPServer.new(PORT)

loop do
  if socket = server.accept?
    spawn handle_connection(socket)
  else
    break
  end
end

, когда я запускаю main.cr, nc localhost 2022 и посылаю «exit», ожидаю, что сокет закроется правильно, но он этого не делает, икогда я посылаю больше команд, программа вызывает ошибку

Unhandled exception in spawn: Error writing file: Broken pipe (Errno)
  from /usr/lib/crystal/crystal/system/unix/file_descriptor.cr:79:13 in 'unbuffered_write'
  from /usr/lib/crystal/io/buffered.cr:122:14 in 'write'
  from /usr/lib/crystal/io.cr:1130:7 in 'copy'
  from /usr/lib/crystal/process.cr:413:7 in 'copy_io'
  from /usr/lib/crystal/process.cr:409:11 in 'copy_io:close_dst'
  from /usr/lib/crystal/process.cr:298:17 in '->'
  from /usr/lib/crystal/fiber.cr:255:3 in 'run'
  from /usr/lib/crystal/fiber.cr:47:34 in '->'
  from ???

1 Ответ

0 голосов
/ 24 июня 2019

Это известная проблема с Crystal. Здесь открыта проблема:

https://github.com/crystal-lang/crystal/issues/7810

...