Ну, что бы вы хотели, чтобы произошло . Системный вызов - это запрос к системе. Если вы спросите: «Когда отправляется паром в Мюнхен?» Вы хотите, чтобы программа завершилась сбоем, или получить возврат = -1 с помощью errno = ENOHARBOR? Если вы попросите систему положить вашу машину в сумочку, хотите ли вы, чтобы ваша сумочка была уничтожена, или возвращение -1 с ошибкой, установленной на EBAGTOOSMALL?
Существует техническая деталь: до или после системных вызовов аргументы для / от пользователя / системы -land должны быть преобразованы (скопированы) при входе / выходе из системного вызова. Главным образом из соображений безопасности система очень неохотно пишет в пространство пользователя. (В Linux для этого есть функция copy_to_user_space (и наоборот), которая проверяет учетные данные до фактического копирования)
Почему? Разве это не скрывает ошибки памяти? `
Наоборот. Это позволяет вашей программе обработать ошибку (в данном случае это невозможно) и корректно завершиться. Но программа должна проверить возвращаемое значение из системных вызовов и проверить errno
. В случае с SIGSEGVE ваша программа мало что может сделать, поэтому преобразование EINVAL в SIGSEGVE было бы плохой идеей.
Системные вызовы были разработаны, чтобы всегда возвращать (или блокировать на неопределенный срок ...), независимо от того, успешно они или нет.
И технический аспект может заключаться в том, что {ошибки сегментации, ошибка памяти, исключение с плавающей запятой, ...} (часто) генерируются аппаратными прерываниями.