автоматическая pushd функция zsh:
setopt autopushd
и вместе с этим:
alias dirs='dirs -v'
Так, чтобы в любое время, я мог ввести dirs
и я получаю историю того, где я был:
0 /var/log
1 /tmp
2 /usr/local/bin
3 ~
и затем я могу cd
назад в, например. /usr/local/bin
путем ввода:
cd ~2
В дополнение к вызову процессов kill(2)
, некоторые сигналы отправляются ядром (или иногда самим процессом) при различных обстоятельствах:
SIGINT
(вернитесь к основному циклу) на Ctrl+C, SIGQUIT
(выход сразу) на Ctrl + \, SIGTSTP
(приостановите) на Ctrl+Z. Ключи могут быть изменены с stty
команда.SIGTTIN
и SIGTTOU
отправляются, когда фоновый процесс пытается читать или записать в его терминал управления.SIGWINCH
отправляется, чтобы сигнализировать, что размер окна терминала изменился.SIGHUP
отправляется, чтобы сигнализировать, что терминал исчез (исторически, потому что Ваш модем завис, в наше время обычно, потому что Вы закрыли окно эмулятора терминала).SIGALRM
уведомляет, что истек таймер, установленный процессом. Таймеры могут быть установлены с alarm
, setitimer
и другие.SIGCHLD
уведомляет процесс, что один из его детей умер.SIGPIPE
сгенерирован, когда процесс пытается записать в канал, когда конец чтения был закрыт (идея - это, если Вы работаете foo | bar
и bar
выходы, foo
уничтожается a SIGPIPE
).SIGPOLL
(также названный SIGIO
) уведомляет процесс, что произошло pollable событие. POSIX указывает pollable события, зарегистрированные через I_SETSIG
ioctl
. Много систем позволяют pollable события на любом дескрипторе файла, устанавливают через O_ASYNC
fcntl
флаг. Связанный сигнал SIGURG
, который уведомляет относительно срочных данных по устройству (зарегистрированный через I_SETSIG
ioctl
) или сокет.SIGPWR
отправляется во все процессы, когда UPS сигнализирует, что сбой питания неизбежен.Эти списки не являются исчерпывающими. Стандартные сигналы определяются в signal.h
.
Большинство сигналов может быть поймано и обработано (или проигнорировано) приложением. Только два портативных сигнала, которые не могут быть пойманы, SIGKILL
(просто умрите), и STOP
(остановите выполнение).
SIGSEGV
(отказ сегментации) и его кузен SIGBUS
(ошибка шины) может быть поймана, но это - плохая идея, если Вы действительно не знаете то, что Вы делаете. Распространенное приложение для ловли их печатает отслеживание стека или другую отладочную информацию. Больше усовершенствованного приложения должно реализовать некоторое незавершенное управление памятью, или захватывать плохие инструкции в механизмах виртуальной машины.
Наконец, позвольте мне упомянуть что-то, что не является сигналом. Когда Вы нажимаете Ctrl+D в начале строки в программе, это читает вход из терминала, это говорит программе, что конец входного файла достигнут. Это не сигнал: это передается через ввод/вывод API. Как Ctrl+C и друзья, ключ может быть настроен с stty
.
Отвечать на Ваш второй вопрос сначала: 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
.SIGTERM
отправляется сначала, сопровождается задержкой, сопровождаемой SIGKILL
. В принципе, для трудного, непосредственного завершения работы, ядро не должно отправлять сигнал вообще; это могло просто прекратить выполнять процесс.
– Jander
24.01.2011, 08:28
SIGFPE
, несколько неинтуитивно, также сообщен на целочисленном делении на нуль, и иногда на переполнении целого числа со знаком. – ephemient 24.01.2011, 21:53