Чтение онлайн

на главную - закладки

Жанры

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

#include <stdlib.h>

int main {

 int return_value;

 return_value = system("ls -l /");

 return return_value;

}

Функция

system
возвращает код завершения указанной команды. Если интерпретатор не может быть запущен, возвращается значение 127, а в случае возникновения других ошибок — -1.

Поскольку функция

system
запускает интерпретатор команд, она подвержена всем тем ограничениям безопасности, что и системный интерпретатор. Рассчитывать
на наличие какой-то конкретной версии Bourne shell не приходится. В большинстве UNIX-систем программа
/bin/sh
представляет собой символическую ссылку на другой интерпретатор. В Linux — это
bash
(Bourne-Again SHell), причем в разных дистрибутивах присутствуют разные его версии. Вызов из функции
system
программы с привилегиями пользователя
root
также может иметь неодинаковые последствия в разных системах. Таким образом, лучше создавать процессы с помощью функций
fork
и
exec
.

3.2.2. Функции fork и exec

В DOS и Windows API имеется семейство функций

spawn
. Они принимают в качестве аргумента имя программы, создают новый экземпляр ее процесса и запускают его. В Linux нет функции, которая делала бы все это за один заход. Вместо этого имеется функция
fork
, создающая дочерний процесс, который является точной копией родительского процесса, и семейство функций
exec
, заставляющих требуемый процесс перестать быть экземпляром одной программы и превратиться в экземпляр другой программы. Чтобы создать новый процесс, нужно сначала с помощью функции
fork
создать копню текущего процесса, а затем с помощью функции
exec
преобразовать одну из копий в экземпляр запускаемой программы.

Вызов функции fork

Вызывая функцию

fork
, программа создает свой дубликат, называемый дочерним процессом. Родительский процесс продолжает выполнять программу с той точки, где была вызвана функция
fork
. То же самое делает и дочерний процесс.

Как же различить между собой оба процесса? Во-первых, дочерний процесс — это новый, только что появившийся в системе процесс, поэтому его идентификатор отличается от идентификатора родительского процесса. Таким образом, программа может вызвать функцию

getpid
и узнать, где именно она находится. Но сама функция
fork
реализует другой способ: она возвращает разные значения в родительском и дочернем процессах. Родительский процесс получает идентификатор своего потомка, а дочернему процессу возвращается 0. В системе нет процессов с нулевым идентификатором, так что программа легко разбирается в ситуации.

В листинге 3.3 приведен пример ветвления программы с помощью функции

fork
. Учтите, что первая часть инструкции
if
выполняется только в родительском процессе, тогда как ветвь
else
— только в дочернем.

Листинг 3.3. (fork.c) Ветвление программы с помощью функции
fork

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

int main {

 pid_t child_pid;

 printf("The main program process ID is %d\n",

(int)getpid);

 child_pid = fork;

 if (child_pid != 0) {

printf("This is the parent process, with ID %d\n",

(int)getpid);

printf("The child's process ID is %d\n", (int)child_pid);

 } else

printf("This is the child process, with ID %d\n",

(int)getpid);

 return 0;

}

Семейство
функций exec

Функции семейства

exec
заменяют программу, выполняющуюся в текущем процессе, другой программой. Когда программа вызывает функцию
exec
, ее выполнение немедленно прекращается и начинает работу новая программа.

Функции, входящие в семейство

exec
, немного отличаются друг от друга по своим возможностям и способу вызова.

■ Функции, в названии которых присутствует суффикс

'p'
(
execvp
и
execlp
), принимают в качестве аргумента имя программы и ищут эту программу в каталогах, определяемых переменном среды
PATH
. Всем остальным функциям нужно передавать полное путевое имя программы.

■ Функции, в названии которых присутствует суффикс

'v'
(
execv
,
execvp
и
execve
), принимают список аргументов программы в виде массива строковых указателей, оканчивающегося
NULL
– указателем. Функции с суффиксом
'l'
(
execl
,
execlp
и
execle
) принимают список аргументов переменного размера.

■ Функции, в названии которых присутствует суффикс

'e'
(
execve
и
execle
), в качестве дополнительного аргумента принимают массив переменных среды. Этот массив содержит строковые указатели и оканчивается пустым указателем. Каждая строка должна иметь вид
"ПЕРЕМЕННАЯ=значение"
.

Поскольку функция

exec
заменяет одну программу другой, она никогда не возвращает значение — только если вызов программы оказался невозможен в случае ошибки.

Список аргументов, передаваемых программе, аналогичен аргументам командной строки, указываемым при запуске программы в интерактивном режиме. Их тоже можно получить с помощью параметров

argc
и
argv
функции
main
. Не забывайте, когда программу запускает интерпретатор команд, первый элемент массива argv будет содержать имя программы, а далее будут находиться переданные программе аргументы. Аналогичным образом следует поступить, формируя список аргументов для функции
exec
.

Совместное использование функций fork и exec

Стандартная методика запуска одной программы из другой такова: сначала с помощью функции

fork
создается дочерний процесс, затем в нем вызывается функция
exec
. Это позволяет главной программе продолжать выполнение в родительском процессе.

Программа, показанная в листинге 3.4, отображает содержимое корневого каталога с помощью команды

ls
, как и программа в листинге 3.2. Но на этот раз команда
ls
вызывается не из интерпретатора, а напрямую; ей передаются аргументы
– l
и
/
.

Поделиться:
Популярные книги

Письма

Пелусиот Исидор
Религия и эзотерика:
религия
5.00
рейтинг книги
Письма

Неучтенный элемент. Том 12

NikL
12. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 12

Царь Живых

Точинов Виктор Павлович
Фантастика:
ужасы и мистика
6.25
рейтинг книги
Царь Живых

Старый тракт (сборник)

Марков Георгий Мокеевич
Сибириада
Проза:
современная проза
7.12
рейтинг книги
Старый тракт (сборник)

Моцарт и его время

Луцкер Павел
Документальная литература:
биографии и мемуары
научпоп
5.00
рейтинг книги
Моцарт и его время

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Дитя прибоя

Трофимов Ерофей
Дитя прибоя
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.25
рейтинг книги
Дитя прибоя

Газлайтер. Том 10

Володин Григорий Григорьевич
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Йога т4

Васиштха
5.00
рейтинг книги
Йога т4

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Хвак

О'Санчес
5.00
рейтинг книги
Хвак

Вся правда о раковых заболеваниях. Новый подход к лечению и профилактике онкологии

Куомо Маргарет
Справочная литература:
прочая справочная литература
5.00
рейтинг книги
Вся правда о раковых заболеваниях. Новый подход к лечению и профилактике онкологии

Начальник милиции. Книга 3

Дамиров Рафаэль
3. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 3

Верховный суд СССР

Коллектив авторов
Научно-образовательная:
история
юриспруденция
5.00
рейтинг книги
Верховный суд СССР