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

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

Жанры

Программирование для 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
и
/
.

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

Сердце Дракона. Том 20. Часть 1

Клеванский Кирилл Сергеевич
20. Сердце дракона
Фантастика:
фэнтези
боевая фантастика
городское фэнтези
5.00
рейтинг книги
Сердце Дракона. Том 20. Часть 1

Холодный ветер перемен

Иванов Дмитрий
7. Девяностые
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Холодный ветер перемен

Последнее желание

Сапковский Анджей
1. Ведьмак
Фантастика:
фэнтези
9.43
рейтинг книги
Последнее желание

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Магия чистых душ 2

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.56
рейтинг книги
Магия чистых душ 2

Наследие Маозари 5

Панежин Евгений
5. Наследие Маозари
Фантастика:
фэнтези
юмористическое фэнтези
5.00
рейтинг книги
Наследие Маозари 5

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф

Миф об идеальном мужчине

Устинова Татьяна Витальевна
Детективы:
прочие детективы
9.23
рейтинг книги
Миф об идеальном мужчине

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Здравствуй, 1984-й

Иванов Дмитрий
1. Девяностые
Фантастика:
альтернативная история
6.42
рейтинг книги
Здравствуй, 1984-й

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам