Поймите коды ошибок в Linux

Основная проблема состоит в том, что мы хотим взять md5sum той же самой информации, которая была на ISO первоначально. Когда Вы пишете ISO в CD, существует вероятный пробел на конце диска, который неизбежно изменяет md5sum. Таким образом, очень самый короткий путь:

md5sum /dev/cdrom

не работает. То, что действительно работает (и распространено в онлайн-документации), только читает точное число байтов от устройства и затем делает md5sum. Если Вы знаете число байтов, можно сделать что-то как:

dd if=/dev/cdrom bs=1 count=xxxxxxxx | md5sum

где 'xxxxx' является размером ISO в байтах.

Если Вы не знаете число байтов от руки, но имеете ISO на Вашем диске все еще, можно получить их использующий ls путем выполнения чего-то как следующее (взятый отсюда):

dd if=/dev/cdrom | head -c `stat --format=%s file.iso` | md5sum

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

Возможные улучшения скорости могут быть сделаны путем выполнения некоторых вычислений для использования большего размера блока ( bs= в dd команда).

4
11.02.2012, 02:00
4 ответа

Существуют значения стандартной погрешности, определенные в errno.h. Можно посмотреть на этот файл в системе для наблюдения численных значений. В большинстве систем они находятся в /usr/include/errno.h или файл, который это включает. На Linux большинство находится в /usr/include/asm-generic/errno-base.h или /usr/include/asm-generic/errno.h, с еще некоторыми в /usr/include/bits/errno.h.

Если у Вас есть численное значение, назовите стандартную библиотечную функцию strerror или perror получить соответствующее сообщение об ошибке (в Вашей текущей локали). Из командной строки быстрым способом видеть строку ошибки является один из

perl -MPOSIX -le 'print strerror 123'
python -c 'import os; print os.strerror(123)'
zmodload zsh/system; syserror 123  # in zsh
5
27.01.2020, 20:46
  • 1
    Спасибо, @Gilles. Я думаю в решении для Python, os.strerror требуется.. –  TheCottonSilk 01.03.2011, 07:28
  • 2
    @TheCottonSilk: Спасибо, зафиксированное. Обратите внимание, что можно теперь предложить редактирования на любом сообщении. –  Gilles 'SO- stop being evil' 01.03.2011, 10:01

От оболочки можно работать perror:

$ perror 123
OS error code 123:  No medium found

Это идет с MySQL.

Если у Вас нет MySQL, можно использовать Perl или Python, например:

$ perl -MPOSIX -e 'print strerror(123)'
No medium found

$ python -c 'import os; print os.strerror(123)'
No medium found

В программе C можно использовать функцию с тем же именем:

void perror(const char *s);

Это печатает Ваше сообщение s с причиной добавленной ошибки.

Или можно использовать:

char *strerror(int errnum);

возвратить описание ошибки как строка, таким образом, можно осмотреть его или распечатать его, как Вам нравится.

Посмотрите man 3 perror и man 3 strerror для деталей.

7
27.01.2020, 20:46
  • 1
    perror(1)? Я никогда не знал это. О, это от MySQL, не у всех есть это. –  Gilles 'SO- stop being evil' 28.02.2011, 23:31
  • 2
    @Gilles D'oh, Вы побеждаете меня к perl версия! ;-) –  Mikel 28.02.2011, 23:37
  • 3
    Спасибо, @Mikel! Я никогда не знал, что эти много опций доступны.. или я удачный быть здесь!!! :) –  TheCottonSilk 01.03.2011, 07:32

Это в конечном счете заканчивается в errno.h после нескольких #includes, Что ошибка является ENOMEDIUM, найденным в /usr/include/asm-generic/errno.h. Вы размонтировали его прежде, чем удалить его?

3
27.01.2020, 20:46
  • 1
    я не размонтировал карту прежде, чем удалить его. Мы должны размонтировать карты SD/MMC? В реализации драйвера (drivers/mmc/core/core.c), предполагается, что карта могла быть удалена во время жизненного цикла. Я соглашаюсь, что может быть продолжающийся запрос (запрос состояния, и т.д.) от ядра (шина) сторона, и это не нашло носитель и повысило эту ошибку. –  TheCottonSilk 28.02.2011, 09:27
  • 2
    Теперь, то, что-123 вопроса решены. Спасибо @Keith! Больший запрос: (в целом), как отследить ошибочные коды/числа в Linux.. какой путь идеален для него? –  TheCottonSilk 28.02.2011, 09:31
  • 3
    Необходимо размонтировать любые смонтированные медиа прежде, чем удалить его. Ядро, возможно, кэшировало некоторые данные и не записало это в медиа все же. Ваша система, возможно, автосмонтировала его (обычно, они настраиваются тот путь), но должен быть вручную (в инструменте GUI или CLI) размонтирован или извлечен, прежде чем можно будет безопасно удалить его. Все Ose требуют этого. –  Keith 28.02.2011, 09:32
  • 4
    я не уверен в общем вопросе. Я всегда просто использую grep и разыскиваю его в заголовочных файлах. Возможно, я запишу сценарий Python. ;-) –  Keith 28.02.2011, 09:34
  • 5
    @Keith: Некоторые Ose заставляют Вас думать, что Вы не должны размонтироваться чисто и выключить буферизацию записи для съемных носителей. Но это не хорошая идея. –  Gilles 'SO- stop being evil' 28.02.2011, 23:22

Можно изучить немного утилиты, названной errno. Это - по существу некоторое хакерство оболочки, которое использует sed вытащить информацию из заголовочных файлов, упомянутых в других ответах. Вывод похож на следующее:

$ errno 123
ENOMEDIUM      123     /* No medium found */
$ errno 111
ECONNREFUSED    111     /* Connection refused */
$ errno 122
EDQUOT        122     /* Quota exceeded */
1
27.01.2020, 20:46
  • 1
    Вы получаете постоянный препроцессор C, но за счет необходимости установить еще одну утилиту и не очень устойчивую в этом. Я буду придерживаться Perl или Python. Или даже zsh, где Вы также получаете постоянное имя с zmodload zsh/system; echo $errnos[123]. –  Gilles 'SO- stop being evil' 01.03.2011, 00:45

Теги

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