ДС18в13-исключения (1238914), страница 2
Текст из файла (страница 2)
некуда§ …кроме ошибочных ситуаций50Структурастека вновьзагруженнойпрограммыСтроки переменных окруженияс нулевым окончаниемДно стекаСтроки аргументов команднойстроки с нулевым окончаниемenvp[n] == NULLenvp[n-1]...envp[0]argv[argc] = NULLargv[argc-1]environ(глобальная)envp(в %rdx)...argv(in %rsi)argv[0]argc(in %rdi)Стековый кадрlibc_start_mainБудущий стековый кадрmainВершина стека51Пример execve¢Выполняет “/bin/ls –lt /usr/include” в дочернемпроцессе используя текущее окружение:(argc == 3)myargvenvironmyargv[argc] = NULLmyargv[2]myargv[1]myargv[0]envp[n] = NULLenvp[n-1]…envp[0]“/usr/include”“-lt”“/bin/ls”“PWD=/usr/droh”“USER=droh”if ((pid = Fork()) == 0) {/* Потомок загружает программу */if (execve(myargv[0], myargv, environ) < 0) {printf("%s: Command not found.\n", myargv[0]);exit(1);}}52Сводка¢Исключения§ События, требующие процессов, отличных от процесса программы§ Возникают вовне (прерывания) или внутри (ловушки и сбои)¢Процессы§ В любой момент, в системе активны несколько процессов§ Только один может исполняться на одном ядре§ Каждому процессу кажется, что он полностью контролируетпроцессор и частное пространство памяти53Сводка (продложение)¢Размножение процессов§ Вызов fork§ На каждый вызов два возврата¢Завершение процесса§ Вызов exit§ После вызова нет возврата¢Ожидание завершения процессов и скашивание§ Вызовы wait или waitpid¢Загрузка и исполнение программ§ Вызов execve (или аналога)§ После вызова (в норме) нет возврата54.