Лекция и рабочая группа в цикле «Системное и низкоуровневое программирование»

Нижний Новгород, 16/V

Что происходит в

   1 #include <stdio.h>
   2 
   3 int main(int argc, char *argv[]) {
   4         puts("QQ!");
   5         return 0;
   6 }

Трудно дойти до конца!

Пример посложнее: копирование из файла в файл по частям

GDB

отсюда

Strace

Отсюда

Дисциплина программирования

(Времени не хватит) LD_PRELOAD

(если хватит — тут + Д/З)

Д/З

  1. Что читать / смотреть:
  2. Написать на Си утилиту noname, которая запускает произвольную программу по заданному пути, подменяя её имя (параметр argv[0]) на заданное и сохраняя параметры

    • Без параметров показывает помощь по запуску
         1 $ ./noname
         2 Usage:
         3         noname path
         4         noname alias path [argumetns]
         5 
      
    • С одним параметром noname /path/to/program — запускает программу program с подменой имени на noname

         1 $ ./noname /usr/bin/java & ps -f
         2 [1] 101656
         3 UID          PID    PPID  C STIME TTY          TIME CMD
         4 george    101233  101231  0 20:54 pts/3    00:00:01 zsh
         5 george    101656  101233  0 21:04 pts/3    00:00:00 noname
         6 george    101657  101233  0 21:04 pts/3    00:00:00 ps -f
         7 
      
      • Вместо java можно запустить любой другой процесс, который не успевает завершиться к моменту вызова ps
    • С двумя и более параметрами noname program alias [param1 [param2 …]] — запускает программу program с подменой имени на alias и передачей ей параметров param1 [param2 …]

         1 $ ./noname alias /usr/bin/sleep 3 & ps -f 
         2 [1] 101698
         3 UID          PID    PPID  C STIME TTY          TIME CMD
         4 george    101233  101231  0 20:54 pts/3    00:00:02 zsh
         5 george    101698  101233  0 21:06 pts/3    00:00:00 alias 3
         6 george    101699  101233  0 21:06 pts/3    00:00:00 ps -f
         7 
      
    • Если программу по какой-то причине нельзя запустить, выводится диагностика, поясняющая причину.
    • Код утилиты написан так, чтобы было проще сделать следующее задание
    • <!> У запускаемой программы достаточно только подменить argv[0], полностью маскировать ничего не надо. Например, просто ps вместо argv пользуется какой-то другой информацией, и во всех примерах выше имя остаётся прежним

  3. Написать shell-сценарий, в котором
    • Вызывается gdb-сценарий, который только в случае запуска утилиты с несколькими параметрами будет выдавать последний параметр

      • Допустимо выводить и другую информацию
    • Вызывается несколько strace с вбрасыванием всех возможных обрабатываемых ошибок

  4. Файлы с решением (исходный текст программы и сценарии) послать в виде приложения к письму по адресу uneexlectures@cs.msu.ru

    • В теме письма должно встречаться слово НЕЙМАРК

Варианты окружения:

Семинар

Нижний Новгород, 23/V

FrBrGeorge/NN_Kerrisk_2024 (последним исправлял пользователь FrBrGeorge 2024-06-19 11:44:48)