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

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

Жанры

Основы программирования в Linux
Шрифт:

#include <stdlib.h>

int system(const char *string);

Функция

system
выполняет команду, переданную ей как строку, и ждет ее завершения. Команда выполняется, как если бы командной оболочке была передана следующая команда:

$ sh -с string

Функция

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

Выполните упражнение 11.1.

Упражнение 11.1. Функция
system

Вы можете использовать

system
для написания программы, выполняющей команду
ps
. Хотя нельзя сказать, что она необычайно полезна, вы увидите, как применять этот метод в последующих примерах. (Для простоты примера мы не проверяем, работает ли на самом деле системный вызов.)

#include <stdlib.h>

#include <stdio.h>

int main {

 printf("Running ps with system\n");

 system("ps ax");

 printf("Done \n");

 exit(0);

}

Когда вы откомпилируете и выполните программу system1.с, то получите вывод, похожий на приведенный далее:

$ ./system1

Running ps with system

 PID TTY STAT TIME COMMAND

1 ? Ss 0:03 init [5]

...

1262 pts/1 Ss 0:00 /bin/bash

1273 pts/2 S 0:00 su -

1274 pts/2 S+ 0:00 -bash

1463 pts/2 SN 0:00 oclock

1465 pts/1 S 0:01 emacs Makefile

1480 pts/1 S+ 0:00 ./system1

1481 pts/1 R+ 0:00 ps ax

Done.

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

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

system("ps ах &");

Когда вы откомпилируете и выполните эту версию программы, то получите следующий вывод:

$ ./system2

Running ps with system

 PID TTY STAT TIME COMMAND

1 ? S 0:03 init [5]

 ...

Done.

$ 1274 pts/2 3+ 0:00 -bash

1463 pts/2 SN 0:00 oclock

1465 pts/1 S 0:01 emacs Makefile

1484 pts/1 R 0:00 ps ax

Как это работает

В первом примере программа вызывает функцию

system
со строкой "
ps ах
", выполняющую программу
ps
. Когда команда
ps
завершается, вызов
system
возвращает управление программе. Функция
system
может быть очень полезной, но она тоже ограничена. Поскольку программа вынуждена ждать, пока не завершится процесс, начатый вызовом
system
, вы не можете продолжить выполнение других задач.

Во втором примере вызов функции

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

$ ps ах &

Далее программа system2 выводит

Done.
и завершается до того, как у команды
ps
появится возможность отобразить до конца весь свой вывод. Вывод
ps
продолжает формироваться после завершения system2 и в этом случае не включает в список элемент, описывающий процесс
system2
. Такое поведение процесса может сильно сбить с толку пользователей. Для того чтобы умело применять процессы, вы должны лучше управлять их действиями. Давайте рассмотрим низкоуровневый интерфейс для создания процесса,
exec
.

Примечание

Вообще применение функции

system
— далеко не идеальный способ создания процессов, потому что запускаемая программа использует командную оболочку. Он неэффективен вдвойне: и потому что перед запуском программы запускается оболочка, и потому что сильно зависим от варианта установки командной оболочки и применяемого окружения. В следующем разделе вы увидите гораздо более удачный способ запуска программ, который почти всегда предпочтительней применения вызова
system
.

Замена образа процесса

Существует целое семейство родственных функций, сгруппированных под заголовком

exec
. Они отличаются способом запуска процессов и представлением аргументов программы. Функция
exec
замещает текущий процесс новым, заданным в аргументе
path
или
file
. Функции
exec
можно применять для передачи выполнения вашей программы другой программе. Например, перед запуском другого приложения с политикой ограниченного применения вы можете проверить имя пользователя и пароль. Функции
exec
более эффективны по сравнению с
system
, т.к. исходная программа больше не будет выполняться после запуска новой программы.

#include <unistd.h>

char **environ;

int execl(const char *path, const char *arg0, ..., (char *)0);

int execlp(const char *file, const char *arg0, ..., (char *)0);

int execle(const char *path, const char *arg0, ..., (char *)0,

 char *const envp[]);

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

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

Винокуров Юрий
30. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга ХХХ

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

Чистильщик

Мазин Александр Владимирович
Детективы:
боевики
6.56
рейтинг книги
Чистильщик

Рыцарь Империи

Буревой Андрей
3. Одержимый
Фантастика:
фэнтези
9.39
рейтинг книги
Рыцарь Империи

МИФОуказания

Асприн Роберт Линн
3. Мифология
Фантастика:
юмористическая фантастика
9.33
рейтинг книги
МИФОуказания

Каратила

Поповский Андрей Владимирович
Детективы:
боевики
6.50
рейтинг книги
Каратила

Локки 8. Потомок бога

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

Товарищ "Чума"

lanpirot
1. Товарищ "Чума"
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Товарищ Чума

Осторожно! Мины!

Шакилов Александр
Фантастика:
боевая фантастика
5.75
рейтинг книги
Осторожно! Мины!

Первый среди равных. Книга V

Бор Жорж
5. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга V

Стечкин

Чуев Феликс Иванович
582. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Стечкин

Над бездной

Делински Барбара
Любовные романы:
современные любовные романы
7.29
рейтинг книги
Над бездной

Аввакум

Бахревский Владислав Анатольевич
Проза:
историческая проза
7.00
рейтинг книги
Аввакум

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6