Ответ 1
Это зависит от того, что вы хотите сделать с помощью script (или любой другой программы, которую вы хотите запустить).
Если вы просто хотите запустить script system
, это самая простая вещь, но она также делает некоторые другие вещи, включая запуск оболочки и выполнение команды (/bin/sh в большинстве * nix).
Если вы хотите либо передать оболочку script через стандартный ввод, либо использовать стандартный вывод, вы можете использовать popen
(и pclose
) для настройки канала. Для выполнения этой команды также используется оболочка (/bin/sh при большинстве * nix).
Обе из них - это функции библиотеки, которые многое делают под капотом, но если они не соответствуют вашим потребностям (или вы просто хотите поэкспериментировать и учиться), вы также можете напрямую использовать системные вызовы. Это также позволяет избежать использования командной оболочки (/bin/sh) для вас.
Интересующие системы представляют собой fork
, execve
и waitpid
. Вы можете использовать одну из оберток библиотеки вокруг execve
(введите man 3 exec
для их списка). Вы также можете использовать одну из других функций ожидания (man 2 wait
имеет их все). Кроме того, вас могут заинтересовать системные вызовы clone
и vfork
, связанные с fork.
fork
дублирует текущую программу, где единственным главным отличием является то, что новый процесс получает 0, возвращенный из вызова в fork. Родительский процесс возвращает новый идентификатор процесса (или ошибку).
execve
заменяет текущую программу новой программой (сохраняя один и тот же идентификатор процесса).
waitpid
используется родительским процессом для ожидания завершения определенного дочернего процесса.
С помощью разметки fork и execve отдельные программы позволяют выполнять некоторую настройку для нового процесса до его создания (без испорчения). Они включают в себя изменение стандартного ввода, вывода и stderr для разных файлов, чем используемый родительский процесс, изменение пользователя или группы процесса, закрытие файлов, которые не нужны ребенку, изменение сеанса или изменение переменных окружения.
Вы также можете быть заинтересованы в системных вызовах pipe
и dup2
. pipe
создает канал (как с входным, так и с дескриптором выходного файла). dup2
дублирует файловый дескриптор как специфический дескриптор файла (dup
аналогичен, но дублирует файловый дескриптор для самого доступного дескриптора файла).