da2s
на os
: из da2s001
должно получиться os001
;Посланный код компилируется с указанием опций -Wall -Wextra -Werror
, которые включают как можно больше warning-ов и превращают их в ошибки компиляции. Это относится и к такой часто встречаемой детали, как неиспользуемые переменные. Если вы имеете в контексте объявленную переменную, которую вы действительно не хотите использовать, можете специально пометить ее с помощью следующего макроса:
#define UNUSED(x) (void)(x)
Например:
int main(int argc, char ** argv)
{
UNUSED(argc);
UNUSED(argv);
return 0;
}
Предварительно вам предлагается подумать, зачем вы завели такую ненужную переменную. Может, она и не ненужная вовсе?
Написать на языке C программу, печатающую на стандартный вывод "Hello, world!
" (с переводом строки в конце).
Необходимо реализовать примитивный вариант утилиты cat
, копирующий символы из stdin на stdout. Для реализации ввода-вывода нужно пользоваться системными вызовами read
и write
. Функциями из stdio.h
(printf
, getchar
, putchar
, ...) можно пользоваться только для вывода отладочной информации и/или сообщений об ошибках.
man 2 read
man 2 write
./cat < cat.c > cat2.c && diff cat.c cat2.c && echo OK
В посылаемом в систему файле не должно быть функции main
, но должна быть функция cat
с сигнатурой void cat()
, которая и делает всю работу.
Пример совершенно не правильного решения, которое, однако, пройдёт первый тест:
#include <iostream>
#include <string>
void cat() {
std::string s;
std::cin >> s;
std::cout << s << "\n";
}
В этом задании вам даётся скомпилированный файл и требуется выяснить, что он делает. Чтобы окончательно отбить желание заниматься дизассемблированием, если оно, вдруг, было (оно не нужно в этом задании), эти программы написаны на C++, скомпилированы со включенными оптимизациями и после этого strip
-нуты.
Для того, чтобы сдать задачу, нужно понять, что делает данная вам программа, и написать программу, которая делает то же самое. Если в какой-то момент вам кажется, что вы понимаете, что делает программа, то, скорее всего, вы правы, никаких подстав и крайних случаев там нет.
Данные программы должны работать на любом разумном 64-битном дистрибутиве Linux-а. Если это не так, нужно об этом сообщить. Если по каким-то причинам очень хочется, чтобы эти файлы работали на 32-битном Linux-е или на mac OS, тоже нужно сообщить.
Это задание состоит из трёх независимых задач:
man 1 strace
man 1 ltrace
man 1 strings