Отвечать на Ваш второй вопрос сначала: 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
.Вероятно, можно было бы рассмотреть использование некоторых сложных эмуляторов терминала как экран (на любом конце), который будет переводить символы, (или использовать некоторое расширение перевода ssh...), или можно было настроить convmvfs представление файловой системы удаленно (с именами файлов, повторно кодированными к локальному кодированию), но существует простое решение:
просто создайте "среду" на локальном хосте особенно к работе с тем удаленным хостом, и работа в этом envoronment (выполните ssh, и т.д.), а именно, в ситуации, когда удаленные имена файлов находятся в CP1251, запустите новый терминал в X, который работал бы с тем кодированием:
$ LC_CTYPE=ru_RU.CP1251 xvt &
и работа от него. (Если Вам нравится консоль Linux больше чем X, вероятно, Вы могли бы настроить виртуальную консоль Linux соответственно, но знание об установке консоли Linux испарялось от моей головы...),
В эмуляторе терминала, который поддерживает 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
LC_ALL
, это - чрезвычайное переопределение для локалей. НаборLANG
если Вы хотите установить значение по умолчанию для всех категорий, или иначе установить точную категорию Вы интересуетесь, например.LC_CTYPE
для набора символов и кодирования. – Gilles 'SO- stop being evil' 26.11.2011, 02:25