Как перенаправить * стандартный вход * и * стандартный выход * на другой PTY, FIFO или разъем?

Мне было интересно, можно ли перенаправить Linux stdio ECL, чтобы он не делил потоки с приложением, в которое он встроен.

Моя проблема в том, что хост-приложение берет на себя stdin, stdout и stderr для своих собственных целей. Итак, я хотел бы иметь отдельную консоль для шумов шумихи и для восстановления, когда SLIME/SWANK возвращается к верхнему уровню. В настоящее время SWANK икоты поставил CL-USER> приглашает в журнал отладки приложений, сбой с C opperation (read) signalled an error стандартный вывод перенаправлен, а стандартный вывод наиболее вероятно закрыт или используется родительским процессом.

Я знаю что ты можешь setf *standand-output* и т. д. в новый поток, но я не нашел способа присоединить к нему терминал, например, screen, xterm или socket. Мне понадобятся базовые файловые дескрипторы Linux/C, и тогда я смогу создать PTY.

Еще лучше было бы, если бы был какой-то способ присоединить их стандартные потоки к серверу сокетов, к которому я мог бы подключиться с помощью telnet.

Обновить

Следуя предложению в комментариях, я попробовал этот код:

(loop for filename in '("stdin-fifo" "stdout-fifo" "stderr-fifo") do
  (let (
        (truename (probe-file filename)))
    (if truename  nil
                       (ext:run-program "/usr/bin/mkfifo" (list filename)))))

(setf *standard-output*
      (open (probe-file "stdout-fifo") :direction :output :if-exists :overwrite))
(setf *error-output*
      (open (probe-file "stderr-fifo") :direction :output :if-exists :overwrite))
(setf *standard-input*
      (open (probe-file "stdin-fifo") :direction :input))

Это не совсем делает работу. Проблема в том, что, хотя некоторые операции ввода-вывода перенаправлены SWANK, кажется, все же есть способ добраться до реальных потоков. Я предполагаю, что потребуется некоторое исследование, чтобы выяснить, как SWANK делает это. О, высокая цена удобства!

Обновление 2

Виноват. Здесь нет *standard-error*, только *error-output*, Можете ли вы сказать, что я очень плохо знаком с Лиспом?

Теперь все перенаправлено. Тем не менее, SLIME не будет говорить с SWANK сейчас, несколько победив цель...

Обновление 3

Победа! Перед тем как подключить SLIME, вам нужно запустить что-то вроде этого сценария оболочки в терминале, чтобы создать оболочку верхнего уровня:

tail -f stdout-fifo &
tail -f stderr-fifo &
cat - >> stdin-fifo

Причина, я не могу догадаться. Но, к счастью, это все равно работает.

Кстати, не отговаривать тех, кто хочет опубликовать лучший ответ

Я уверен, что кто-то может создать сокет-сервер или отсоединенный от экрана PTY, который будет радовать потоки независимо от того, наблюдает ли кто-то за ними или нет. Это было бы гораздо более классное решение.

0 ответов

Другие вопросы по тегам