Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Запуск програми

Читайте также:
  1. Windows. Для чего служит Панель Задач?: приложение,которое используется для запуска других программили управления уже запущенными,и представляет собой панель инстрментов
  2. Аварии при запуске ракет-это
  3. Алгоритм и его способы записи(язык програмирования,псевдокод,блок-схема).
  4. Анотація програми навчальної дисципліни
  5. В марте 2011 года тоже говорилось о перезапуске бренда и о появлении электронных носителей.
  6. Витяг з робочої навчальної програми
  7. Действие локомотивной бригады при запуске дизеля 10Д100 после длительного отстоя.
  8. Дизель тепловоза ТЭ10 нормально запускается, но после отключения пусковых контакторов останавливается. Причины и действие локомотивной бригады.
  9. ДОДАТОК А. Код програми
  10. ЗАДАНИЕ 1.Запуск программы Outlook Express

Запуск нових програм в UNIX відокремлений від створення процесів і реалізований за допомогою системних викликів сімейства ехес (). На практиці звичайно реалізують один виклик (у Linux це — execve ()).

У Linux підтримують концепцію оброблювачів двійкових форматів (binary format handlers). Формати виконуваних файлів заздалегідь реєструють в ядрі, при цьому їхній набір може динамічно змінюватися. З кожним форматом пов'язаний оброблювач - спеціальна структура даних lіnux_binfmt, що містить покажчики на процедури завантаження виконуваного файла (load _binary) і динамічної бібліотеки (load_shlib) для цього формату.

Тепер зупинимося на послідовності кроків виконання execve () у Linux. Вхідними параметрами цього виклику є рядок з ім'ям виконуваного файла програми, масив аргументів командного рядка (до яких у коді процесу можна буде дістати доступ за допомогою масиву argv) і масив змінних оточення (що є парами ім’я = значення). Виклик execve() відбувається так.

1. Відкривають виконуваний файл програми.

2. Використовуючи вміст цього файла, ініціалізують спеціальну структуру даних
bprm, що містить інформацію, необхідну для виконання файла, зокрема відомості про його двійковий формат.

3. Виконують дії для забезпечення безпеки виконання коду.

4. На базі параметрів виклику формують командний рядок і набір змінних ото-
чення програми (це спеціальні поля структури bprm).

5. Для кожного зареєстрованого оброблювача бінарного формату викликають
процедуру завантаження виконуваного файла через покажчик load_binary і перевіряють результат цього виклику:

а) у разі коректного завантаження оброблювач починає виконувати код нової програми;

б) якщо жоден з оброблювачів не зміг коректно завантажити код, повертають помилку.

Детальному розгляду процесу завантаження програмного коду в пам’ять і форматів виконуваних файлів буде присвячено розділ 14.

 

Запуск виконуваних файлів у прикладних програмах

Розглянемо приклад запуску виконуваного файла за допомогою системного виклику execve(). Синтаксис цього виклику такий:

#іпсlude <unistd.h>

int execve ( const char *filename. // повне ім’я файлу

const char *argv[ ], // масив аргументів командного рядка

const char *envp[]); // масив змінних оточення

Останнім елементом argv і envp має бути нульовий покажчик.

Повернення з виклику буде тільки тоді, коли програму не вдалося завантажити (наприклад, файл не знайдено). Тоді буде повернено -1.

 

Наведемо приклад формування параметрів і виклику (зазначимо, що першим елементом argv задане ім'я виконуваної програми):

char *prog = "./child";

char *args[] - { \/chiId", "argl", NULL };

char *env[] = { NULL };

if (execve (prog, args, env) == -1) {

printf ("помилка під час виконання програми: %s\n", prog);
exit (-1);

}

Реалізація технологи fork+exec

Наведемо приклад коду, що реалізує технологію fork+exec:
if ((pid = fork ()) < 0) exit (-1):

if (pid == 0) { // нащадок завантажує замість себе іншу програму
// ... завдання prog, args і env
if (execve (prog, args, env)== -1) {

printf("помилка під час запуску нащадка\n");
exit (-1);

}

}

else {

// предок продовжує роботу (наприклад, очікує закінчення нащадка)

}


Дата добавления: 2014-12-20; просмотров: 6 | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2021 год. (0.028 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав