41.1 Функции, создающие подпроцессы

Существует три примитива, которые создают новый подпроцесс для выполнения программы. Один из них, make-process, создает асинхронный процесс и возвращает объект процесса (см. Создание асинхронного процесса). Другие два, call-process и call-process-region, создают синхронный процесс и не возвращают объект процесса (см. Создание синхронного процесса). Существуют различные более высокоуровневые функции, которые используют эти примитивы для запуска определенных типов процессов.

Синхронные и асинхронные процессы объясняются в следующих разделах. Поскольку все три функции вызываются схожим образом, их общие аргументы описаны здесь.

Во всех случаях функции указывают программу, которую необходимо запустить. Ошибка сигнализируется, если файл не найден или не может быть выполнен. Если имя файла относительное, переменная exec-path содержит список директорий для поиска. Emacs инициализирует exec-path при запуске на основе значения переменной окружения PATH. Стандартные конструкции имен файлов, «~», «.» и «..», интерпретируются как обычно в exec-path, но подстановки переменных окружения («$HOME», и т. д.) не распознаются; используйте substitute-in-file-name для их выполнения (см. Функции расширения имен файлов). nil в этом списке относится к default-directory.

Выполнение программы также может включать добавление суффиксов к указанному имени:

Пользовательский вариант: exec-suffixes

Эта переменная является списком суффиксов (строк), которые следует попробовать добавить к указанному имени файла программы. В список следует включить "", если вы хотите, чтобы имя было проверено в точности как указано. Значение по умолчанию зависит от системы.

Обратите внимание: Аргумент program содержит только имя файла программы; он может не содержать аргументов командной строки. Вы должны использовать отдельный аргумент, args, как описано ниже, чтобы предоставить их.

Каждая из функций создания подпроцессов имеет аргумент buffer-or-name, который указывает, куда будет направлен вывод программы. Это должен быть буфер или имя буфера; если это имя буфера, то буфер будет создан, если он еще не существует. Он также может быть nil, что означает отбрасывание вывода, если только пользовательская функция фильтрации не обрабатывает его. (См. Функции фильтрации процессов и Чтение и вывод Lisp-объектов.) Обычно следует избегать ситуаций, когда несколько процессов отправляют вывод в один и тот же буфер, поскольку их вывод будет случайным образом перемешан. Для синхронных процессов вы можете отправлять вывод в файл вместо буфера (и соответствующий аргумент, следовательно, более уместно называется destination). По умолчанию, как стандартный вывод, так и стандартный вывод ошибок направляются в одно и то же место назначения, но все 3 примитива позволяют опционально направлять поток ошибок в другое место назначения.

Все три функции создания подпроцессов позволяют указывать аргументы командной строки для запускаемого процесса. Для call-process и call-process-region они передаются в виде аргумента &rest, args. Для make-process как программа для запуска, так и ее аргументы командной строки указываются как список строк. Аргументы командной строки должны быть строками, и они передаются программе как отдельные строки аргументов. Символы подстановки (wildcard) и другие конструкции оболочки не имеют специального значения в этих строках, поскольку строки передаются непосредственно указанной программе.

Подпроцесс наследует свою среду от Emacs, но вы можете указать переопределения с помощью process-environment. См. Среда операционной системы. Подпроцесс получает свой текущий каталог из значения default-directory.

Переменная: exec-directory

Значение этой переменной — это строка, имя каталога, содержащего программы, поставляемые с GNU Emacs и предназначенные для вызова Emacs. Программа movemail является примером такой программы; Rmail использует ее для получения новой почты из входящих.

Пользовательский вариант: exec-path

Значение этой переменной — это список каталогов для поиска программ, которые будут запущены в подпроцессах. Каждый элемент — это либо имя каталога (т. е. строка), либо nil, что означает каталог по умолчанию (который является значением default-directory). См. executable-find для подробностей по этому поиску.

Значение exec-path используется call-process и start-process, когда аргумент program не является абсолютным именем файла.

В целом, вы не должны изменять exec-path напрямую. Вместо этого убедитесь, что ваша переменная окружения PATH установлена должным образом перед запуском Emacs. Попытка изменить exec-path независимо от PATH может привести к запутанным результатам.

Функция: exec-path

Эта функция является расширением переменной exec-path. Если default-directory указывает на удаленный каталог, эта функция возвращает список каталогов, используемых для поиска программ на соответствующем удаленном хосте. В случае локального default-directory функция возвращает просто значение переменной exec-path.

При запуске программы, входящей в дистрибутив Emacs, вы должны учитывать, что программа могла быть переименована в соответствии с ограничениями именования исполняемых файлов, присутствующими в системе.

Вместо запуска ctags, например, вы должны указать значение ctags-program-name. Точно так же, вместо запуска movemail, вы должны запускать movemail-program-name, и то же самое относится к etags, hexl, emacsclient, rcs2log и ebrowse.