Основы программирования в 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[]);
Поделиться:
Популярные книги
Менталист. Эмансипация
1. Выиграть у времени
Фантастика:
альтернативная история
7.52
рейтинг книги
Кодекс Охотника. Книга V
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Виконт. Книга 1. Второе рождение
1. Псевдоним `Испанец`
Фантастика:
фэнтези
боевая фантастика
попаданцы
6.67
рейтинг книги
Эволюция мага
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Месть Паладина
5. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Новый Рал
1. Рал!
Фантастика:
фэнтези
попаданцы
5.70
рейтинг книги
Академия
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Прометей: владыка моря
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Тринадцатый
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
6.80
рейтинг книги
Мастер темных Арканов
1. Мастер темных арканов
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Дайте поспать! Том II
2. Вечный Сон
Фантастика:
фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Возрождение Феникса. Том 1
1. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.79
рейтинг книги
Его темная целительница
2. Любовь среди туманов
Фантастика:
фэнтези
5.75