Книга: Разработка приложений в среде Linux. Второе издание
10.5.1. Запуск и ожидание с помощью system()
10.5.1. Запуск и ожидание с помощью system()
Программам часто требуется запускать другие программы и ожидать их завершения, прежде чем продолжать свою работу. Функция system()
позволяет это делать достаточно просто.
int system (const char* cmd);
порождает дочерний процесс, который выполняет
system()exec()
для /bin/sh
, который, в свою очередь, запускает cmd
. Исходный процесс ожидает завершения дочерней оболочки и возвращает тот же код, что wait()
[28]. Если вам не нужно оставлять в памяти оболочку (что случается редко), cmd
должна включать предшествующее слово "exec"
, которое заставляет оболочку вызывать exec()
вместо запуска cmd
как подпроцесса.
Поскольку cmd
запускается из оболочки /bin/sh
, то здесь применимы все обычные правила расширения команд. Ниже показан пример вызова system()
, который отображает исходные тексты С из текущего каталога.
#include <stdlib.h>
#include <sys/wait.h>
int main() {
int result;
result = system("exec ls *.c");
if (!WIFEXITED(result))
printf("(аварийный выход)n");
exit(0);
}
Команда system()
должна применяться с большой осторожностью в программах, которые запускаются со специальными полномочиями. Поскольку системная оболочка предоставляет множество мощных средств и сильно зависит от переменных окружения, system()
является уязвимым местом в плане безопасности, которым могут воспользоваться злоумышленники для проникновения в систему. Однако до тех пор, пока приложение не является демоном или программой setuid/setgid
, вызов system()
совершенно безопасен.
- 10.5. Простые дочерние процессы
- Запуск InterBase-сервера
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- Повышение производительности приложений с помощью хранимых процедур
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Организация пользователей в группы с помощью ролей
- Одновременный запуск нескольких копий сервера (multi-instancing)
- System tools used for debugging
- Integrated Secure Communications System
- Запуск Access. Открытие учебной базы данных Борей
- Обработка запросов с помощью PHP
- Способы «запуска» слухов