История Unix: код возврата восьмеричный?

10

Сегодня меня застали врасплох gdb:

Program exited with code 0146.

gdbвыводит код возврата в восьмеричном виде ; выясняю, почему я нашел: http://comments.gmane.org/gmane.comp.gdb.devel/30363

Но это не особенно удовлетворительный ответ. Некоторый быстрый поиск в Google не раскрыл историю, поэтому я надеялся, что кто-то на SO может знать предысторию.

Несколько связанный вопрос, как можно было бы просмотреть код возврата в восьмеричном виде? Возможно, старые машины всегда печатали код возврата?

$ printf %o\\n $?

Довольно неловко :)

похлопывание
источник
значение $?оболочки для кода возврата и десятичная цифра (или GDB также поддерживает ваш пример cmd?). Не знаю, почему GDB сообщает об этом в восьмеричном. Мое решение состоит в том, чтобы выйти и man asciiувидеть, что означают восьмеричные значения. Интересный вопрос, поскольку вы также наталкиваетесь на восьмеричные значения из других программ. Может быть, это обсуждается в Kernighan и Pike 'Unix Programming Envioronment'. Удачи.
shellter
Статус выхода может быть больше, чем цифра, это фактически байт. Кроме того, man asciiбыло бы бесполезно преобразовывать восьмеричное в десятичное. bcбудет лучшим выбором.
Jlliagre
2
Код возврата - это число , а не десятичное или восьмеричное. Программа возвращает состояние (один байт). С помощью wait (3) или его триба родительский процесс может узнать много информации о том, почему процесс завершился (обычно, то есть добровольно, вызывая exit (2); убит сигналом, ...)
vonbrand

Ответы:

6

Восьмеричное представление облегчает интерпретацию кода выхода для небольших значений, которые наиболее часто используются. Если это число, которое является байтом, было напечатано в десятичном виде, то для определения того, какой сигнал прервал процесс, потребуется немного вычислений, а в восьмеричном, они могут быть прочитаны как есть:

  • процесс выходит со статусом 5, gdbотображает 05без разницы
  • процесс выходит , потому что он получил SIGINT( Control+ C), gdbдисплеи , 0202которые легче распознать как сигнал # 2 , чем 130.

Кроме того, состояние выхода также может быть битовой маской, и в этом случае восьмеричное значение (по крайней мере, когда вы к нему привыкли, что было более распространенным пару десятилетий назад, чем в наши дни), легче преобразовать мысленно в биты, чем десятичное или даже шестнадцатеричный, так же , как, например , по- chmodпрежнему принимает восьмеричное число для представления прав доступа к файлам: 0750 = 111 101 000 = rwx r-x ---.

jlliagre
источник
Возможно, это неправильное место, чтобы спросить это, но есть ли простой способ узнать, является ли число, данное GDB, восьмеричным или десятичным?
Маринара
3
Соглашение состоит в том, что если оно начинается с нуля (0), оно восьмерично.
Jlliagre
3

У меня нет копии этого текста, и я просто прочитал краткую рекламу, доступную в книгах Google, но. Согласно руководству по переносимости X / Open System V Спецификации Команды и утилиты, стр. 283 (согласно Google Books)

если приложение завершает работу ненормально, его статус выхода - восьмеричное 0200 + status, и есть список общих значений «status» (которые, вероятно, также приведены в восьмеричном виде).

Так что это / было сообщение об ошибке бедного человека.


источник