Оболочка действительно имеет какое-то отношение к этому сообщению, и crsh
косвенно вызывает оболочку, которая, вероятно, является bash
.
Я написал небольшую программу на C, которая всегда выделяет ошибки:
#include <stdio.h>
int
main(int ac, char **av)
{
int *i = NULL;
*i = 12;
return 0;
}
Когда я запускаю ее из своей оболочки по умолчанию, zsh
, я получаю следующее:
4 % ./segv
zsh: 13512 segmentation fault ./segv
Когда я запускаю ее из bash
, я понимаю то, что вы отметили в своем вопросе:
bediger@flq123:csrc % ./segv
Segmentation fault
Я собирался написать обработчик сигнала в своем коде, затем я понял, что вызов библиотеки system ()
, используемый crsh
exec - это оболочка, / bin / sh
в соответствии с системой man 3
. Этот / bin / sh
почти наверняка выводит «Ошибка сегментации», поскольку crsh
определенно нет.
Если вы переписываете crsh
, чтобы использовать системный вызов execve ()
для запуска программы, вы не увидите строку «Ошибка сегментации». Он исходит из оболочки, вызываемой system ()
.
В системах с малым -порядком байтов это результат представления в памяти строк, чисел с плавающей запятой и двойных чисел. Начиная с «A», 65 или 0x41, как число с плавающей запятой (od -t fF
), это соответствует
00000000000000000000000001000001
что равно 9,1⋅10-44(см. этот удобный преобразователь)— 0 бит для знака (положительный ), 0 показатель степени (, который смещен, на -126 для числа с плавающей запятой )и дроби 2-17 + 2-23 . Таким образом, представленное значение равно (2-17 + 2-23)× 2-126(см. Wolfram Alpha). Добавление новой строки приводит к
00000000000000000000101001000001
, что равно 3,678⋅10-42 .
Использование удвоений(od -t fD
)добавляет еще четыре байта нулей к началу числа, что не меняет знак или показатель степени, и еще больше уменьшает дробь, что помимо большего смещения для удвоений (-1022 ), приводит к очень маленьким числам, которые вы видите (см. этот другой конвертер, который использует двойные числа):«A» (2-46 + 2-52)× 2-1022(см. Wolfram Alpha ), «A» с последующей новой строкой: (2-41 + 2-43 + 2-46 + 2-52)× 2-1022(см. Wolfram Alpha ).