Программы
Первая реальная утилита

Первая реальная утилита

Вы когда-нибудь писали код командной строки? А из чего она состоит? А поковыряемся чутка!

Ещё до было немного информации

Пишите программы, которые делают что-то одно и делают это хорошо.

Дуг Макилрой, изобретатель каналов 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 истина одна, а вот ошибочных вариантов работы программы (лжи) может быть много.

Изображение Шпаргалка по командам Linux, FreeBSD и MacOS

Компиляция, запуск

Собираем компилятором clang:

    clang false.c -o ./false

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

  • clang'у для компиляции даём файл false.c (с программой, описанной выше).
  • Ключ -o – куда выводить результат. К нашем случае – ./false.

Clang – один из компиляторов Си (также есть gcc, MSVS и т.д.).

Запускаем:

falseecho $?
    1

Ломаем false

О да, как только мы что-то сказали или написали, сразу стоит подумать: а как это "сломать". На самом деле, интерес не в том, чтобы что-то испортить, но заставить работать иначе, чем задумывалось: как ребёнок, мы будем искать "границы дозволенного".

Итак, я предлагаю вам подумать: что же может пойти "не так", учитывая то определение, которое мы дали утилите false. Также есть скользкий момент с самим кодом. Нет, безусловно, наш false прекрасен и нерушим, но и тут есть интересные моменты...

Дальше, к ответу на "загадку".