работа с именами файлов в другом кодировании по ssh

Отвечать на Ваш второй вопрос сначала: SIGSTOP и SIGKILL не может быть пойман приложением, но любой сигнал может, даже SIGSEGV. Это свойство полезно для отладки - например, с правильной поддержкой библиотеки, Вы могли прислушаться SIGSEGV и генерируйте след стека для показа, где это segfault произошло.

Официальное слово (для Linux, так или иначе) на том, что делает каждый сигнал, доступно путем ввода man 7 signal из командной строки Linux. http://linux.die.net/man/7/signal имеет ту же информацию, но таблицы более трудно считать.

Однако без некоторого опыта с сигналами, трудно знать из кратких описаний, что они делают на практике, таким образом, вот моя интерпретация:

Инициированный с клавиатуры

  • SIGINT происходит, когда Вы совершаете нападки CTRL+C.
  • SIGQUIT инициирован CTRL+\, и ядро дампов.
  • SIGTSTP приостанавливает Вашу программу, когда Вы совершаете нападки CTRL+Z. В отличие от этого, SIGSTOP, это catchable, который дает программы как vi шанс сбросить терминал к безопасному состоянию прежде, чем временно отстранить себя.

Терминальные взаимодействия

  • SIGHUP ("зависание") - то, что происходит, когда Вы закрываете свой xterm (или иначе разъединяете терминал), в то время как Ваша программа работает.
  • SIGTTIN и SIGTTOU приостановите свою программу, если она пытается читать из или записать в терминал, в то время как она работает в фоновом режиме. Для SIGTTOU для случая я думаю потребности программы записать в /dev/tty, не просто значение по умолчанию stdout.

Инициированный исключением ЦП

Они означают, что Ваша программа пыталась сделать что-то не так.

  • SIGILL означает недопустимую или неизвестную инструкцию по процессору. Это могло бы произойти, если бы Вы пытались получить доступ к портам процессора I/O непосредственно, например.
  • SIGFPE средство там было аппаратной математической ошибкой; скорее всего, программа пыталась разделиться на нуль.
  • SIGSEGV означает, что Ваша программа пыталась получить доступ к неотображенному региону памяти.
  • SIGBUS означает, что программа получила доступ к памяти неправильно некоторым другим способом; я не сообщу подробности для этой сводки.

Взаимодействие процесса

  • SIGPIPE происходит, при попытке записать в канал после того, как читатель канала закрыл их конец. Посмотрите man 7 pipe.
  • SIGCHLD происходит, когда дочерний процесс Вы создали или выходы или временно отстранены ( SIGSTOP или подобный).

Полезный для самопередачи сигналов

  • SIGABRT обычно вызывается программой, звоня abort() функция и причины дамп ядра по умолчанию. Вид "аварийной кнопки".
  • SIGALRM вызывается alarm() системный вызов, который заставит ядро поставлять a SIGALRM к программе после конкретного количества секунд. Посмотрите man 2 alarm и man 2 sleep.
  • SIGUSR1 и SIGUSR2 используются однако, программе нравится. Они могли быть полезны для передачи сигналов между процессами.

Отправленный администратором

Эти сигналы обычно отправляются от командной строки, через kill команда, или fg или bg в случае SIGCONT.

  • SIGKILL и SIGSTOP unblockable сигналы. Первое всегда сразу завершает процесс; второе приостанавливает процесс.
  • SIGCONT возобновляет приостановленный процесс.
  • SIGTERM catchable версия SIGKILL.

8
13.04.2017, 15:36
2 ответа

Вероятно, можно было бы рассмотреть использование некоторых сложных эмуляторов терминала как экран (на любом конце), который будет переводить символы, (или использовать некоторое расширение перевода ssh...), или можно было настроить convmvfs представление файловой системы удаленно (с именами файлов, повторно кодированными к локальному кодированию), но существует простое решение:

просто создайте "среду" на локальном хосте особенно к работе с тем удаленным хостом, и работа в этом envoronment (выполните ssh, и т.д.), а именно, в ситуации, когда удаленные имена файлов находятся в CP1251, запустите новый терминал в X, который работал бы с тем кодированием:

$ LC_CTYPE=ru_RU.CP1251 xvt &

и работа от него. (Если Вам нравится консоль Linux больше чем X, вероятно, Вы могли бы настроить виртуальную консоль Linux соответственно, но знание об установке консоли Linux испарялось от моей головы...),

3
27.01.2020, 20:12
  • 1
    Не устанавливать LC_ALL, это - чрезвычайное переопределение для локалей. Набор LANG если Вы хотите установить значение по умолчанию для всех категорий, или иначе установить точную категорию Вы интересуетесь, например. LC_CTYPE для набора символов и кодирования. –  Gilles 'SO- stop being evil' 26.11.2011, 02:25

В эмуляторе терминала, который поддерживает UTF-8, можно использовать luit управляйте для выполнения подоболочки (или другая программа) в другой локали. Локаль, устанавливающая, который указывает на наборы символов, LC_CTYPE.

LC_CTYPE=ru_RU.KOI8-R luit ls   # run one command
LC_CTYPE=ru_RU.KOI8-R luit      # start a shell (type Ctrl+D or exit to return to the parent shell)

Если у Вас есть целое дерево файлов в другом кодировании, я рекомендую (если возможный) монтирование его через convmvfs.

mkdir ~/net/ivan@example.com.KOI8-R ~/net/ivan@example.com.UTF-8
sshfs ivan@example.com: ~/net/ivan@example.com.KOI8-R
convmvfs -o srcdir=~/net/ivan@example.com.KOI8-R,icharset=KOI8-R,ocharset=UTF-8 ~/net/ivan@example.com.UTF-8
ls ~/net/ivan@example.com.UTF-8
4
27.01.2020, 20:12

Теги

Похожие вопросы