main(argc,argv)
int argc;
char *argv[];
{
execl(argv[0], argv[0], 0);
}
Рисунок 7.36
21. По условию первым аргументом функции exec является имя (последняя компонента имени пути поиска) исполняемого процессом файла. Что произойдет в результате выполнения программы, приведенной на Рисунке 7.37? Каков будет эффект, если в качестве файла "a.out" выступит загрузочный модуль, полученный в результате трансляции программы, приведенной на Рисунке 7.36?
main() {
if (fork() == 0) {
execl("a.out", 0);
printf("неудачное завершение функции exec\n");
}
}
Рисунок 7.37
22. Предположим, что в языке Си поддерживается новый тип данных "read-only" (только для чтения), причем процесс, пытающийся записать информацию в поле с этим типом, получает отказ системы защиты. Опишите реализацию этого момента. (Намек: сравните это понятие с понятием "разделяемая область команд".) В какие из алгоритмов ядра потребуется внести изменения? Какие еще объекты могут быть реализованы аналогичным с областью образом?
23. Какие изменения имеют место в алгоритмах open, chmod, unlink и unmount при работе с файлами, для которых установлен режим "sticky-bit"? Какие действия, например, следует предпринять в отношении такого файла ядру, когда с файлом разрывается связь?
24. Суперпользователь является единственным пользователем, имеющим право на запись в файл паролей "/etc/passwd", благодаря чему содержимое файла предохраняется от умышленной или случайной порчи. Программа passwd дает пользователям возможность изменять свой собственный пароль, защищая от изменений чужие записи. Каким образом она работает?
*25. Поясните, какая угроза безопасности хранения данных возникает, если setuid-программа не защищена от записи.
26. Выполните следующую последовательность команд, в которой "a.out" — имя исполняемого файла:
chmod 4777 a.out
chown root a.out
Команда chmod "включает" бит setuid (4 в 4777); пользователь "root" традиционно является суперпользователем. Может ли в результате выполнения этой последовательности произойти нарушение защиты информации?
27. Что произойдет в процессе выполнения программы, представленной на Рисунке 7.38? Поясните свой ответ.
main() {
char *endpt;
char *sbrk();
int brk();
endpt = sbrk(0);
printf("endpt = %ud после sbrk\n", (int) endpt);
while (endpt--) {
if (brk(endpt) == -1) {
printf("brk с параметром %ud завершилась неудачно\n", endpt);
exit();
}
}
}
Рисунок 7.38
28. Библиотечная подпрограмма malloc увеличивает область данных процесса с помощью функции brk, а подпрограмма free освобождает память, выделенную подпрограммой malloc. Синтаксис вызова подпрограмм:
ptr = malloc(size);
free(ptr);
где size — целое число без знака, обозначающее количество выделяемых байт памяти, а ptr — символьная ссылка на вновь выделенное пространство. Прежде чем появиться в качестве параметра в вызове подпрограммы free, указатель ptr должен быть возвращен подпрограммой malloc. Выполните эти подпрограммы.
29. Что произойдет в процессе выполнения программы, представленной на Рисунке 7.39? Сравните результаты выполнения этой программы с результатами, предусмотренными в системном описании.
main() {
int i;
char *cp;
extern char *sbrk();
cp = sbrk(10);
for (i = 0; i ‹ 10; i++) *cp++ = 'a' + i;
sbrk(-10);
cp = sbrk(10);
for (i = 0; i ‹ 10; i++) printf("char %d = %c\n", i, *cp++);
}
Рисунок 7.39. Пример программы, использующей подпрограмму sbrk
30. Каким образом командный процессор shell узнает о том, что файл исполняемый, когда для выполнения команды создает новый процесс? Если файл исполняемый, то как узнать, создан ли он в результате трансляции исходной программы или же представляет собой набор команд языка shell? В каком порядке следует выполнять проверку указанных условий?
31. В командном языке shell символы "››" используются для направления вывода данных в файл с указанной спецификацией, например, команда: run ››outfile открывает файл с именем "outfile" (а в случае отсутствия файла с таким именем создает его) и записывает в него данные. Напишите программу, в которой используется эта команда.
main() { exit(0); }
Рисунок 7.40
32. Процессор командного языка shell проверяет код, возвращаемый функцией exit, воспринимая нулевое значение как "истину", а любое другое значение как "ложь" (обратите внимание на несогласованность с языком Си). Предположим, что файл, исполняющий программу на Рисунке 7.40, имеет имя "truth". Поясните, что произойдет, когда shell будет исполнять следующий набор команд:
Читать дальше