Ещё до было немного информации
Пишите программы, которые делают что-то одно и делают это хорошо.
Дуг Макилрой, изобретатель каналов Unix
От слов к делу! И начнём мы с написания вполне реальной полноценной утилиты, которая есть в Linux / MacOS / FreeBSD. В общем, пишем утилиту POSIX "false":
/*
Это первая программа на Си
*/
int // функция возвращает число (integer)
main(void) { // Принимает ничто (void)
return 1; // Всё "плохо" - вернули 1
}
Что происходит:
- Комментарии могуть быть
//
и/* */
- Объявляем функцию main – именно она является точкой входа для программы на Си:
- Сначала пишем int – функция вернёт знаковое число (integer).
- В скобках – аргументы функции. В нашем случае ничего не надо. Ничто = void.
- В теле функции (внутри фигурных скобок):
- Возвращаем из функции 1. Для функции main – это код возврата программы (errorlevel / $?).
Собственно, именно это и делает утилита false – возвращает не 0. Возможно, вам это покажется странным: во многих языках как раз 0 - ложь, а ненулевые значения – истина. Но в POSIX истина одна, а вот ошибочных вариантов работы программы (лжи) может быть много.
Компиляция, запуск
Собираем компилятором clang:
clang false.c -o ./false
Что происходит:
- clang'у для компиляции даём файл
false.c
(с программой, описанной выше). - Ключ
-o
– куда выводить результат. К нашем случае – ./false.
Clang – один из компиляторов Си (также есть gcc, MSVS и т.д.).
Запускаем:
→ false
→ echo $?
1
false
Ломаем О да, как только мы что-то сказали или написали, сразу стоит подумать: а как это "сломать". На самом деле, интерес не в том, чтобы что-то испортить, но заставить работать иначе, чем задумывалось: как ребёнок, мы будем искать "границы дозволенного".
Итак, я предлагаю вам подумать: что же может пойти "не так", учитывая то
определение, которое мы дали утилите false
. Также есть скользкий момент
с самим кодом. Нет, безусловно, наш false прекрасен и нерушим, но и тут
есть интересные моменты...
Дальше, к ответу на "загадку".