Отправка сигнала в подпроцесс — это способ прервать его деятельность. Существует несколько различных сигналов, каждый со своим значением. Набор сигналов и их названия определяются операционной системой. Например, сигнал SIGINT означает, что пользователь набрал C-c или произошло нечто аналогичное.
Каждый сигнал имеет стандартный эффект на подпроцесс. Большинство сигналов завершают работу подпроцесса, но некоторые вместо этого останавливают (или возобновляют) выполнение. Большинство сигналов могут быть опционально обработаны программами; если программа обрабатывает сигнал, то в общем случае мы ничего не можем сказать о его эффектах.
Вы можете явно отправлять сигналы, вызывая функции в этом разделе. Emacs также автоматически отправляет сигналы в определенное время: завершение буфера отправляет сигнал SIGHUP всем связанным с ним процессам; завершение Emacs отправляет сигнал SIGHUP всем оставшимся процессам. (SIGHUP — это сигнал, который обычно указывает на то, что пользователь «повесил трубку», то есть отключился.)
Каждая функция отправки сигналов принимает два необязательных аргумента: process и current-group.
Аргумент process должен быть либо процессом, либо именем процесса, либо буфером, либо именем буфера, либо nil. Буфер или имя буфера относятся к процессу через get-buffer-process. nil относится к процессу, связанному с текущим буфером. За исключением stop-process и continue-process, ошибка сигнализируется, если process не указывает на активный процесс или если он представляет сетевое, последовательное или коннектное соединение.
Аргумент current-group — это флаг, который имеет значение, когда вы запускаете оболочку управления заданиями как подпроцесс Emacs. Если он не равен nil, то сигнал отправляется в текущую группу процессов терминала, который Emacs использует для связи с подпроцессом. Если процесс является оболочкой управления заданиями, это означает текущий подзадание оболочки. Если current-group равен nil, сигнал отправляется в группу процессов непосредственного подпроцесса Emacs. Если подпроцесс является оболочкой управления заданиями, то это сама оболочка. Если current-group равен lambda, сигнал отправляется в группу процессов, владеющую терминалом, но только если это не сама оболочка.
Флаг current-group не имеет эффекта, когда для связи с подпроцессом используется коннект, потому что операционная система не поддерживает это различие в случае коннектов. По той же причине оболочки управления заданиями не будут работать при использовании коннекта. См. process-connection-type в Создание асинхронного процесса.
Эта функция прерывает процесс process, отправляя сигнал SIGINT. Вне Emacs нажатие символа прерывания (обычно C-c в некоторых системах и DEL в других) отправляет этот сигнал. Когда аргумент current-group не равен nil, вы можете думать об этой функции как о нажатии C-c в терминале, через который Emacs общается с подпроцессом.
Эта команда завершает процесс process, отправляя сигнал SIGKILL. Этот сигнал немедленно завершает работу подпроцесса и не может быть обработан подпроцессом. В интерактивном режиме он запросит у пользователя имя процесса, по умолчанию используя процесс (если таковой имеется) в текущем буфере.
Эта функция отправляет сигнал SIGQUIT процессу process. Этот сигнал отправляется символом выхода (обычно C-\), когда вы не находитесь внутри Emacs.
Эта функция останавливает указанный process. Если это реальный подпроцесс, выполняющий программу, она отправляет сигнал SIGTSTP этому подпроцессу. Если process представляет сетевое, последовательное или коннектное соединение, эта функция препятствует обработке входящих данных из соединения; для сетевого сервера это означает отказ от принятия новых соединений. Используйте continue-process для возобновления нормального выполнения.
Вне Emacs, в системах с управлением заданиями, символ остановки (обычно C-z) обычно отправляет сигнал SIGTSTP подпроцессу. Когда current-group не равен nil, вы можете думать об этой функции как о нажатии C-z в терминале, который Emacs использует для связи с подпроцессом.
Эта функция возобновляет выполнение процесса process. Если это реальный подпроцесс, выполняющий программу, она отправляет сигнал SIGCONT этому подпроцессу; это предполагает, что process был остановлен ранее. Если process представляет сетевое, последовательное или коннектное соединение, эта функция возобновляет обработку входящих данных из соединения. Для последовательных соединений данные, поступившие во время остановки процесса, могут быть потеряны.
Эта функция отправляет сигнал процессу process. Аргумент signal указывает, какой сигнал отправить; это должно быть целое число или символ, имя которого является сигналом.
Аргумент process может быть системным идентификатором процесса ID (целым числом); это позволяет отправлять сигналы процессам, которые не являются дочерними процессами Emacs. См. Доступ к другим процессам.
Если process — это объект процесса, содержащий свойство remote-pid, или process — это число, а remote — это удаленное имя файла, process интерпретируется как процесс на соответствующем удаленном хосте, который будет сигналом.
Если process — это строка, она интерпретируется как объект процесса с соответствующим именем процесса или как число.
Иногда необходимо отправить сигнал нелокальному асинхронному процессу. Это возможно, написав собственную реализацию interrupt-process или signal-process. Эту функцию затем необходимо добавить в interrupt-process-functions или signal-process-functions соответственно.
Эта переменная является списком функций, которые будут вызваны для interrupt-process. Аргументы функций такие же, как и для interrupt-process. Эти функции вызываются в порядке списка до тех пор, пока одна из них не вернет не-nil. Функция по умолчанию, которая всегда будет последней в этом списке, — это internal-default-interrupt-process.
Это механизм, с помощью которого Tramp реализует interrupt-process.
Эта переменная является списком функций, которые будут вызваны для signal-process. Аргументы функций такие же, как и для signal-process. Эти функции вызываются в порядке списка до тех пор, пока одна из них не вернет не-nil. Функция по умолчанию, которая всегда будет последней в этом списке, — это internal-default-signal-process.
Это механизм, с помощью которого Tramp реализует signal-process.