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