Системное программирование.кс_СПО

Системное программирование.кс_СПО

Просмотрите все вопросы и варианты бесплатно. Правильные ответы скрыты и открываются только после получения доступа.

50 вопросов Вариант 1 Доступ 7 дней
Содержание теста

Вопросы и варианты

Без отметок и подсказок к правильным ответам

Вопрос 1

Какая последовательность наиболее корректно описывает полный путь C-программы от исходного файла до исполняемого файла в Linux?

  1. компилятор → препроцессор → линкер → ассемблер
  2. препроцессор → компилятор → ассемблер → линкер
  3. линкер → препроцессор → компилятор → ассемблер
  4. ассемблер → компилятор → препроцессор → линкер
Вопрос 2

Что означает использование ключа `-c` при вызове `gcc`?

  1. программа компилируется и сразу запускается
  2. создаётся исполняемый файл без объектных файлов
  3. создаётся объектный файл, но этап линковки не выполняется
  4. создаётся только препроцессированный текст без машинного кода
Вопрос 3

Почему при линковке C-программы порядок объектных файлов и библиотек может иметь значение?

  1. потому что компилятор читает только первый файл в команде
  2. потому что библиотеки обычно должны идти после объектных файлов, которые на них ссылаются
  3. потому что Linux запрещает указывать библиотеки после ключа `-o`
  4. потому что объектные файлы всегда должны идти после всех библиотек
Вопрос 4

Что представляет собой статическая библиотека `.a` в типичной сборке Linux?

  1. исполняемый файл, запускаемый динамическим загрузчиком
  2. архив объектных файлов, обычно создаваемый утилитой `ar`
  3. текстовый список зависимостей проекта
  4. специальный файл окружения для `gcc`
Вопрос 5

Какое утверждение о shared-библиотеке `.so` является наиболее точным?

  1. её код всегда полностью копируется в исполняемый файл на этапе компиляции
  2. она является объектом, который может подгружаться динамическим загрузчиком при запуске программы
  3. она используется только для хранения заголовочных файлов
  4. она создаётся исключительно командой `make clean`
Вопрос 6

Если одновременно доступны `libname.a` и `libname.so`, что обычно выберет GCC/линкер без явного указания статической сборки?

  1. всегда статическую библиотеку `.a`
  2. динамическую библиотеку `.so`
  3. ни одну библиотеку, пока не будет указан полный путь
  4. случайную библиотеку в зависимости от размера файла
Вопрос 7

Для чего чаще всего используют команду `ldd` применительно к уже собранному бинарному файлу?

  1. чтобы посмотреть динамические зависимости исполняемого файла
  2. чтобы удалить неиспользуемые объектные файлы
  3. чтобы преобразовать `.so` в `.a`
  4. чтобы заменить исходный код на машинный
Вопрос 8

Зачем при сборке shared-библиотеки часто используют ключ `-fPIC`?

  1. чтобы запретить программе пользоваться динамическим линкером
  2. чтобы получить позиционно-независимый код, подходящий для shared object
  3. чтобы автоматически создать Makefile
  4. чтобы удалить символы отладки из исходного файла
Вопрос 9

Что означает передача параметров линкеру через конструкцию вида `-Wl,...`?

  1. `gcc` передаёт указанные параметры непосредственно линкеру
  2. `gcc` воспринимает эти параметры как комментарии
  3. параметры применяются только к препроцессору
  4. параметры используются только при запуске программы, но не при сборке
Вопрос 10

Какую задачу решает `rpath/runpath` при работе с shared-библиотеками?

  1. сообщает компилятору, какие строки исходного файла пропустить
  2. позволяет встроить в бинарный файл информацию о путях поиска `.so`
  3. преобразует динамическую библиотеку в статическую
  4. запрещает динамическому линкеру искать зависимости
Вопрос 11

В чём основной смысл использования `Makefile` в учебном проекте сборки?

  1. Makefile всегда заменяет компилятор GCC
  2. Makefile делает сборку воспроизводимой и позволяет пересобирать только изменившиеся части
  3. Makefile нужен только для запуска уже готовой программы
  4. Makefile используется только для редактирования файлов в `nano`
Вопрос 12

Что означает автоматическая переменная `$@` в типичном правиле Makefile?

  1. имя текущей цели правила
  2. имя первого зависимого файла
  3. список всех переменных окружения
  4. код завершения последней команды shell
Вопрос 13

Какой вариант наиболее правильно раскрывает различие между `man 2 open` и `man 3 printf`?

  1. `man 2 open` относится к системному вызову, а `man 3 printf` — к библиотечной функции
  2. `man 2 open` открывает редактор, а `man 3 printf` запускает компилятор
  3. оба варианта показывают одну и ту же страницу справки
  4. `man 2` используется только для команд shell, а `man 3` — только для драйверов
Вопрос 14

Что такое окружение процесса в Linux?

  1. набор открытых файлов, доступных только ядру
  2. массив строк вида `NAME=VALUE`, передаваемый процессу при запуске
  3. список всех пользователей системы
  4. двоичный файл, который создаётся после линковки
Вопрос 15

Что делает команда или встроенная функция shell `export`?

  1. удаляет переменную из памяти родительского процесса
  2. помечает переменную так, чтобы она попала в окружение запускаемых далее команд
  3. автоматически записывает переменную в исходный код программы
  4. делает переменную доступной ядру как системный вызов
Вопрос 16

Как ведёт себя окружение при `fork()`?

  1. дочерний процесс наследует копию окружения родительского процесса
  2. дочерний процесс всегда получает пустое окружение
  3. окружение родителя полностью переносится в ядро и удаляется из процесса
  4. `fork()` запрещён, если в окружении есть пользовательские переменные
Вопрос 17

Что наиболее точно описывает роль файлового дескриптора в Linux?

  1. это имя файла, сохранённое в каталоге
  2. это маленькое неотрицательное число, через которое процесс обращается к открытому файлу или каналу
  3. это адрес функции в shared-библиотеке
  4. это номер строки в Makefile
Вопрос 18

Когда аргумент `mode` в вызове `open(path, flags, mode)` имеет практический смысл?

  1. только при использовании флага `O_CREAT`
  2. только при чтении из уже существующего файла
  3. всегда, независимо от флагов
  4. только при закрытии файла через `close()`
Вопрос 19

Что означает возвращаемое значение `0` у `read()` при чтении обычного файла?

  1. произошла ошибка доступа
  2. файл был успешно удалён
  3. достигнут конец файла
  4. ядро автоматически повторит чтение
Вопрос 20

Почему при использовании `write()` нельзя всегда считать, что все байты были записаны за один вызов?

  1. `write()` в Linux никогда не записывает больше одного байта
  2. возможна частичная запись, поэтому оставшиеся данные нужно дозаписывать в цикле
  3. `write()` используется только для каталогов
  4. `write()` всегда завершает процесс после первой записи
Вопрос 21

Для каких объектов `lseek()` неприменим в обычном смысле изменения позиции чтения/записи?

  1. для обычных файлов на диске
  2. для файлов, открытых только на чтение
  3. для pipe, FIFO и socket
  4. для файлов, созданных через `O_CREAT`
Вопрос 22

Для чего в учебной программе-копировщике используется `perror()`?

  1. чтобы вывести текстовое описание ошибки на основе текущего `errno`
  2. чтобы автоматически исправить ошибку чтения
  3. чтобы заменить системный вызов `read()`
  4. чтобы очистить содержимое файла назначения
Вопрос 23

Какое утверждение лучше всего объясняет роль каталога в файловой системе Linux?

  1. каталог — это обычная строковая переменная shell
  2. каталог хранит соответствие между именем файла и индексным дескриптором
  3. каталог всегда содержит только текстовые файлы
  4. каталог является копией всех данных файлов внутри него
Вопрос 24

Что такое inode в контексте файловой системы Linux?

  1. только пользовательское имя файла
  2. объект метаданных файла, связанный с содержимым, правами, владельцем, размером и другими свойствами
  3. команда для создания shared-библиотеки
  4. переменная окружения, отвечающая за поиск `.so`
Вопрос 25

Чем символическая ссылка принципиально отличается от жёсткой ссылки?

  1. символическая ссылка содержит путь к другому файлу, а жёсткая ссылка является ещё одним именем того же inode
  2. символическая ссылка всегда больше исходного файла, а жёсткая всегда меньше
  3. символическая ссылка создаётся только для каталогов, а жёсткая — только для устройств
  4. между ними нет различий на уровне файловой системы
Вопрос 26

Что показывает первый символ в выводе `ls -l`?

  1. размер файла в байтах
  2. тип объекта файловой системы
  3. номер процесса, который открыл файл
  4. количество строк в файле
Вопрос 27

Какой первый символ в `ls -l` обычно соответствует каталогу?

  1. `-`
  2. `d`
  3. `l`
  4. `p`
Вопрос 28

Какое утверждение о правах доступа к каталогу в Linux является наиболее корректным?

  1. право `x` для каталога связано с возможностью проходить через каталог и обращаться к объектам внутри него
  2. право `x` для каталога всегда означает запуск каталога как программы
  3. право `r` для каталога автоматически разрешает удалять любые файлы внутри него
  4. права доступа к каталогам в Linux не проверяются
Вопрос 29

Что представляет собой файловая система `/proc`?

  1. обычный каталог с резервными копиями пользовательских файлов
  2. виртуальную файловую систему, через которую можно получать сведения о процессах и состоянии системы
  3. архив статических библиотек ядра
  4. каталог, который существует только после запуска компилятора
Вопрос 30

Что характерно для разреженного файла?

  1. он не может иметь логический размер больше физически занятых блоков
  2. он может содержать «дыры», которые логически читаются как нули и не занимают соответствующий объём на диске
  3. он всегда является символьной ссылкой
  4. он создаётся только в оперативной памяти и не связан с файловой системой
Вопрос 31

Для чего применяются блокировки областей файла?

  1. чтобы запретить компилятору собирать программу
  2. чтобы координировать доступ процессов к определённым участкам файла
  3. чтобы преобразовать inode в имя файла
  4. чтобы заменить механизм прав доступа `rwx`
Вопрос 32

В каком случае неименованный канал `pipe` подходит лучше всего?

  1. когда нужно связать потоки внутри одного процесса без участия ядра
  2. когда нужно организовать потоковую передачу данных между родственными процессами, например после `fork()`
  3. когда нужно сохранить сообщения в каталоге `/proc`
  4. когда требуется заменить все shared-библиотеки статическими
Вопрос 33

Какое событие обычно приводит к `SIGPIPE` при работе с каналом или сокетом?

  1. успешное чтение всех данных из файла
  2. запись в канал или сокет, у которого больше нет читателя
  3. создание нового inode
  4. вызов `make clean`
Вопрос 34

Чем FIFO отличается от обычного неименованного `pipe`?

  1. FIFO имеет имя в файловой системе и может использоваться неродственными процессами
  2. FIFO не относится к механизмам IPC
  3. FIFO всегда хранит данные на диске навсегда
  4. FIFO работает только внутри одного потока
Вопрос 35

Почему очередь сообщений может быть предпочтительнее простого байтового канала?

  1. потому что она запрещает нескольким процессам обмениваться данными
  2. потому что она позволяет работать с сообщениями как с отдельными единицами, а не только с непрерывным потоком байтов
  3. потому что она автоматически компилирует C-код
  4. потому что она используется только для удаления файлов
Вопрос 36

Какое утверждение о сигналах в многопоточной программе Linux является наиболее точным?

  1. disposition сигнала является свойством процесса, а маска сигналов — свойством конкретного потока
  2. disposition сигнала является свойством файла, а маска сигналов — свойством каталога
  3. каждый поток имеет полностью независимую таблицу обработчиков сигналов
  4. маска сигналов всегда одинакова для всех процессов системы
Вопрос 37

Что означает утверждение, что стандартные сигналы обычно не очередятся?

  1. если один и тот же стандартный сигнал несколько раз пришёл в заблокированном состоянии, после разблокировки обычно фиксируется один факт доставки
  2. стандартные сигналы вообще никогда не доставляются процессу
  3. каждый стандартный сигнал обязательно хранится с точным счётчиком повторов
  4. стандартные сигналы можно использовать только в драйверах ядра
Вопрос 38

Какие сигналы нельзя поймать, заблокировать или проигнорировать?

  1. `SIGINT` и `SIGTERM`
  2. `SIGKILL` и `SIGSTOP`
  3. `SIGUSR1` и `SIGUSR2`
  4. `SIGALRM` и `SIGPIPE`
Вопрос 39

Почему для нового кода предпочтительнее использовать `sigaction()`, а не `signal()`?

  1. `sigaction()` даёт более предсказуемое и расширяемое управление обработкой сигналов
  2. `sigaction()` полностью запрещает доставку сигналов процессу
  3. `signal()` работает только с файлами, а не с процессами
  4. `sigaction()` нужен только для сборки shared-библиотек
Вопрос 40

Какой подход к обработчику сигнала считается наиболее безопасным для начинающего системного программиста?

  1. выполнять в обработчике всю логику программы, включая ввод-вывод и выделение памяти
  2. в обработчике ограничиться простым действием, например установкой флага, а основную работу выполнить в обычном коде
  3. запускать из обработчика `gcc` для пересборки программы
  4. всегда вызывать `printf()` из обработчика без ограничений
Вопрос 41

Какой режим `sigprocmask()` полностью заменяет текущую маску сигналов новой маской?

  1. `SIG_BLOCK`
  2. `SIG_UNBLOCK`
  3. `SIG_SETMASK`
  4. `SIG_REPLACE_ONLY`
Вопрос 42

Почему связка `sigprocmask()` + `sigsuspend()` важна при ожидании сигнала?

  1. она позволяет ждать сигнал без гонки между проверкой условия и засыпанием процесса
  2. она полностью отключает планировщик Linux
  3. она создаёт новый дочерний процесс
  4. она заменяет `fork()` и `exec()`
Вопрос 43

Что происходит после успешного вызова `fork()`?

  1. родительский процесс исчезает, а дочерний продолжает работу один
  2. родитель и дочерний процесс продолжают выполнение со следующей строки, но имеют разные PID и разные адресные пространства
  3. код программы автоматически заменяется другой программой
  4. создаётся новый поток в том же адресном пространстве без нового процесса
Вопрос 44

Какое возвращаемое значение `fork()` получает дочерний процесс?

  1. `0`
  2. PID родительского процесса
  3. `-1` при любом успешном создании
  4. дескриптор исполняемого файла
Вопрос 45

Что делает успешный вызов семейства `exec`?

  1. создаёт второй процесс, полностью копируя память родителя
  2. заменяет образ текущего процесса новой программой и при успехе обычно не возвращается в старый код
  3. только добавляет новую переменную окружения
  4. завершает только дочерние потоки, не затрагивая программу
Вопрос 46

Почему родительскому процессу обычно нужно вызывать `wait()` или `waitpid()` после завершения дочернего процесса?

  1. чтобы собрать статус завершения ребёнка и не оставить зомби-процесс
  2. чтобы повторно выполнить препроцессор
  3. чтобы превратить дочерний процесс в поток
  4. чтобы автоматически создать FIFO
Вопрос 47

Чем поток принципиально отличается от отдельного процесса в рассматриваемой модели?

  1. поток обычно выполняется в адресном пространстве своего процесса, а отдельный процесс имеет собственное адресное пространство
  2. поток всегда имеет собственную независимую файловую систему
  3. поток нельзя планировать операционной системой
  4. поток не может выполнять функции на языке C
Вопрос 48

Что делает `pthread_join()`?

  1. запускает новый процесс через `execve()`
  2. ожидает завершения указанного потока и позволяет получить его результат завершения
  3. немедленно уничтожает весь процесс
  4. блокирует все сигналы в системе
Вопрос 49

Зачем при работе с разделяемыми данными между потоками используют mutex?

  1. чтобы исключить одновременный некорректный доступ к критической секции
  2. чтобы заменить объектные файлы `.o`
  3. чтобы автоматически преобразовать поток в процесс
  4. чтобы запретить системные вызовы `read()` и `write()`
Вопрос 50

Какое утверждение наиболее точно связывает `mmap()`, модули ядра и драйверы в общей логике системного программирования Linux?

  1. `mmap()` всегда используется только внутри драйверов и не доступен пользовательским программам
  2. `mmap()` связывает виртуальную память процесса с файлом или областью памяти, а модули и драйверы встраиваются в ядро через специальные точки входа вроде `module_init()` и `module_exit()`, не имея обычной функции `main()`
  3. модули ядра собираются как обычные пользовательские программы и запускаются командой `./module`
  4. драйвер устройства — это только текстовый файл в `/proc`, не связанный с файловой моделью Linux