Существует три примитива, которые создают новый подпроцесс для выполнения
программы. Один из них, make-process, создает асинхронный
процесс и возвращает объект процесса (см. Создание асинхронного процесса).
Другие два, call-process и call-process-region,
создают синхронный процесс и не возвращают объект процесса (см. Создание синхронного процесса). Существуют различные более высокоуровневые
функции, которые используют эти примитивы для запуска определенных типов
процессов.
Синхронные и асинхронные процессы объясняются в следующих разделах. Поскольку все три функции вызываются схожим образом, их общие аргументы описаны здесь.
Во всех случаях функции указывают программу, которую необходимо запустить.
Ошибка сигнализируется, если файл не найден или не может быть выполнен. Если
имя файла относительное, переменная exec-path содержит список
директорий для поиска. Emacs инициализирует exec-path при
запуске на основе значения переменной окружения PATH.
Стандартные конструкции имен файлов, «~», «.» и
«..», интерпретируются как обычно в exec-path,
но подстановки переменных окружения («$HOME», и т. д.)
не распознаются; используйте substitute-in-file-name для их
выполнения (см. Функции расширения имен файлов).
nil в этом списке относится к default-directory.
Выполнение программы также может включать добавление суффиксов к указанному имени:
Эта переменная является списком суффиксов (строк), которые следует
попробовать добавить к указанному имени файла программы. В список следует
включить "", если вы хотите, чтобы имя было
проверено в точности как указано. Значение по умолчанию зависит от
системы.
Обратите внимание: Аргумент program содержит только имя файла программы; он может не содержать аргументов командной строки. Вы должны использовать отдельный аргумент, args, как описано ниже, чтобы предоставить их.
Каждая из функций создания подпроцессов имеет аргумент buffer-or-name,
который указывает, куда будет направлен вывод программы. Это должен быть буфер
или имя буфера; если это имя буфера, то буфер будет создан, если он еще
не существует. Он также может быть nil, что означает отбрасывание
вывода, если только пользовательская функция фильтрации не обрабатывает его. (См.
Функции фильтрации процессов и Чтение и вывод Lisp-объектов.) Обычно следует избегать
ситуаций, когда несколько процессов отправляют вывод в один и тот же буфер,
поскольку их вывод будет случайным образом перемешан. Для синхронных процессов
вы можете отправлять вывод в файл вместо буфера (и соответствующий аргумент,
следовательно, более уместно называется destination). По
умолчанию, как стандартный вывод, так и стандартный вывод ошибок направляются в
одно и то же место назначения, но все 3 примитива позволяют опционально
направлять поток ошибок в другое место назначения.
Все три функции создания подпроцессов позволяют указывать аргументы командной
строки для запускаемого процесса. Для call-process и
call-process-region они передаются в виде аргумента
&rest, args. Для make-process
как программа для запуска, так и ее аргументы командной строки указываются как
список строк. Аргументы командной строки должны быть строками, и они передаются
программе как отдельные строки аргументов. Символы подстановки (wildcard) и
другие конструкции оболочки не имеют специального значения в этих строках,
поскольку строки передаются непосредственно указанной программе.
Подпроцесс наследует свою среду от Emacs, но вы можете указать переопределения
с помощью process-environment. См. Среда операционной системы.
Подпроцесс получает свой текущий каталог из значения default-directory.
Значение этой переменной — это строка, имя каталога, содержащего
программы, поставляемые с GNU Emacs и предназначенные для вызова Emacs.
Программа movemail является примером такой программы; Rmail
использует ее для получения новой почты из входящих.
Значение этой переменной — это список каталогов для поиска
программ, которые будут запущены в подпроцессах. Каждый элемент — это либо
имя каталога (т. е. строка), либо nil, что означает
каталог по умолчанию (который является значением default-directory).
См. executable-find для подробностей
по этому поиску.
Значение exec-path используется call-process
и start-process, когда аргумент program не
является абсолютным именем файла.
В целом, вы не должны изменять exec-path напрямую. Вместо
этого убедитесь, что ваша переменная окружения PATH
установлена должным образом перед запуском Emacs. Попытка изменить
exec-path независимо от PATH может привести
к запутанным результатам.
Эта функция является расширением переменной exec-path.
Если default-directory указывает на удаленный каталог, эта
функция возвращает список каталогов, используемых для поиска программ на
соответствующем удаленном хосте. В случае локального default-directory
функция возвращает просто значение переменной exec-path.
При запуске программы, входящей в дистрибутив Emacs, вы должны учитывать, что программа могла быть переименована в соответствии с ограничениями именования исполняемых файлов, присутствующими в системе.
Вместо запуска ctags, например, вы должны указать
значение ctags-program-name. Точно так же, вместо
запуска movemail, вы должны запускать
movemail-program-name, и то же самое относится к etags, hexl, emacsclient,
rcs2log и ebrowse.