Почему определения истинности и ложности в stdbool.h полностью противоположны истине и ложности программ UNIX?

Предполагая, что вы используете Linux, тайм-аут — самый простой способ сделать это. 08 :00 до 19 :00 составляет 11 часов, поэтому мы указываем timeout для запуска скрипта в течение 11 часов.

timeout 11h /home/username/script

Запустите задание с помощью cron в 08 :00 (или вручную, когда захотите )и автоматически завершите его в 19 :00 с другой записью cron

kill -9 /home/username/script

5
26.03.2021, 09:45
4 ответа

Я могу только думать об этом обосновании, и оно кажется мне довольно сильным.

Самый простой способ перевести булевы операции в компьютерную арифметику — использовать 0вместо FALSEи 1вместо TRUE, и тогда все операции с ними имеют смысл, т. е.

TRUE  && TRUE =  TRUE  ( 1 * 1 = 1)
TRUE  && FALSE = FALSE ( 1 * 0 = 0)
TRUE  || FALSE = TRUE  ( 1 + 0 = 1)
FALSE || FALSE = FALSE ( 0 + 0 = 0)

И так далее и тому подобное.

В то же время программам требуется несколько статусов выхода, чтобы сообщать о различных ошибках. Логично сделать правильный статус выхода как 0, а затем использовать оставшиеся 255 (unsigned char )как плохие статусы выхода.

Теперь, конечно, 1можно было бы сделать хорошим выходным статусом, но тогда плохие стали бы разорванным массивом 0и 2..555, что очень нелогично.

-1
28.04.2021, 22:55

Существует несколько причин сбоя программы. Например, grepдает сбой, если не находит искомый шаблон или не может открыть один из указанных файлов.

В настоящее время Unix позволяет передавать 1 (беззнаковый )байт значения (код возврата )от дочернего элемента к его родителю (Я игнорирую информацию о том, какой сигнал убил дочерний элемент, если было сгенерировано ядро ​​и т. д., которое могло бы вернуть еще несколько битов ).

Поскольку существует несколько способов сбоя, имеет смысл использовать несколько кодов возврата для кодирования этих различных сбоев и иметь один код возврата для индикации успеха.

Отсюда следует, что(0)является разумным выбором для обозначения успеха, остальные (1 -255 )указывают на отказ (и тип отказа ).

Было бы вполне возможно использовать 17 для обозначения успеха, а от 0 до 16 и от 18 до 255 означать неудачу, но для простоты было выбрано 0 для успеха и от 1 до 255 для неудач, поэтому существует единый диапазон. Столь же просто было бы использовать 255 для успеха и от 0 до 254 для неудач. Однако это ограничило бы будущие изменения возвратом более 8 бит и сохранением простоты единого диапазона кодов ошибок.

4
28.04.2021, 22:55

Вы путаете две разные вещи:

  1. Целые числа, используемые в качестве логических значений.

    Логическое значение — это ответ на вопрос :"Совпадает ли значение этой переменной со значением этой другой переменной?" Ответ: ложь или истина . Они могут быть закодированы как 0 или 1.

  2. Целые числа, используемые в качестве статуса выхода -.

    Статус выхода -является констатацией факта :«Утилита завершила работу после успешного выполнения того, о чем ее просили сделать.», «Утилита столкнулась с определенной ошибкой и завершилась ошибкой». Статус выхода -может быть закодирован как любое целое число от 0 до 127, где ноль означает успех или отсутствие ошибок .

Они похожи , но только потому, что оба используют целые числа как способ кодирования истинные и ложные(логические значения )или успешные и неудачно(статус выхода ). Другими вещами, в которых используются целые числа, являются количество сантиметров, на которые спортсмен может прыгнуть, и рейтинг, связанный с этим спортсменом на основе этого прыжка, но мы редко путаем их.

В языке C операторы ifвоздействуют непосредственно на результат арифметического вычисления данного выражения. Поскольку оболочка всегда была ориентирована на выполнение программ и обработку конвейеров заданий и т. д., ifв оболочке делается оператор для определения того, успешно ли запущена утилита или нет.Это включает в себя проверку состояния выхода -запущенной утилиты.

Статус выхода -равен нулю , если утилита завершилась успешно. Вы получаете логическое значение, когда спрашиваете «Является ли статус выхода -нулевым?», что и делает оператор ifв оболочке(if utility; then echo ok; else not ok; fi). Если утилита не прошла успешно, вы получите ложный результат этого теста, и затем вы можете начать смотреть на статус выхода -и диагностический вывод утилиты, чтобы попытаться выяснить, что пошло не так. неправильно.

Статус выхода -может кодировать конкретную причину, по которой утилита завершилась неудачно, подобно библиотечным функциям и системным вызовам в C, которые часто устанавливают «код состояния errno», который кодирует информацию, аналогичную вызывающей стороне (, см. man errnoи, например, разделы RETURN VALUEи ERRORSв stat(2)сman 2 stat).

Утилита falseбезуспешно ничего не делает. Вы можете видеть, что он терпит неудачу, потому что он устанавливает ненулевой статус выхода -:

$ false; echo "$?"
1

Это 1не логическое значение. Это не -нулевой выход -, означающий сбой.

Если вы хотите использовать логическую логику в оболочке, используйте $((... ))для вычисления вашего выражения и утилиту testдля сравнения:

if [ "$(( a == 12 ))" -ne 0 ]; then
    echo 'a is 12'
fi

В этом примере значение $aсравнивается как целое число с 12. Если $aравно 12, арифметическое расширение расширится до 1, в противном случае до 0. Это логические значения .

Статус выхода -из [ "$(( a == 12 ))" -ne 0 ]был бы нулевым, если $aбыл равен 12, что приводило к выполнению echo, или отличным от -нулем, если $aне был t 12, что приводит к пропуску echo.

Утилиты с более интересными статусами выхода -, чем просто 0 и 1, см., например. руководство curl(раздел EXIT CODESближе к концу ), а руководство rsyncруководство (раздел EXIT VALUESближе к концу ).

1
28.04.2021, 22:55

Происхождение истинного = 1 и ложного = 0

Если вы хотите знать исторический контекст того, почему истина равна 1, а ложь равна 0, я хотел бы отметить, что булева алгебра была «изобретена» Джорджем Булем в 1847 году. Это было задолго до появления первых электронных компьютеров. Булева алгебра была опубликована в "МАТЕМАТИЧЕСКОМ АНАЛИЗЕ ЛОГИКИ". Вы можете прочитать копию проекта Гутенберга :http://www.gutenberg.org/files/36884/36884-pdf.pdf

.

Я не утверждаю, что читал его подробно, но я просмотрел достаточно, чтобы увидеть, что сам Джордж Буль использовал 1 как истинное и 0 как ложное.


Влияние Буля на вычисления

Алгебра Буля («Булевая алгебра» )в значительной степени игнорировалась, пока она не была поднята спустя много времени после его смерти и использована в вычислениях. Еще до компьютеров на основе кремния булева алгебра стала полезной в отношении бинарной электроники (, в отличие от аналоговой ). Было просто перенести математические логические операторы в транзисторную схему (, см. здесь ). Отсюда было достаточно просто соединить несколько логических вентилей, чтобы представить число в двоичном виде и выполнить простую арифметику .


Что касается операторов «если», они были получены из ЦП операции «условный переход», где переход известен как gotoв языках более высокого уровня.

Для условных переходов ЦП должны определить полезный способ выбора перехода или отказа от перехода. Двумя наиболее распространенными условными операторами являются «переход, если ноль» и «переход, если отрицательный» (, см. подчеркнутую страницу 39 здесь ). Однако интерпретация числа как положительного или отрицательного может быть субъективной, поскольку одни и те же операции ЦП используются для двух дополнительных целых чисел со знаком как "беззнаковых" целых чисел.

Так что это все, чтобы сказать,общее утверждение ifостановилось на 0 для ложного и 1 для истинного, потому что:

  • отрицательное/положительное определение не работало бы для целых чисел без знака
  • и 0 для истинного и 1 для ложного было бы противоположностью обычно используемой булевой алгебры

Почему оболочка отличается?

Трудно найти происхождение оболочки, делающей противоположное. 0, потому что успех определенно восходит к 1970-м годам и возможно, самым ранним версиям unix(не уверен).

Я считаю, что программа может полностью преуспеть только в одном случае, но потерпеть неудачу во многих отношениях.

Что кажется очевидным, так это то, что команды trueи falseбыли разработаны в соответствии с интерпретацией оболочки использования статуса выхода команды в условной логике:

if first_command ; then
    second_command
fi

Если приведенный выше код предназначен для запуска second_command, если first_commandвыполнено успешно. Тогда хорошим именем для логического заполнителя, который всегда завершается успешно, будет true.

2
28.04.2021, 22:55

Теги

Похожие вопросы