2016-01-26 2 views
4

В чем разница между EACCES и EPERM в точности? EPERM описывается here как «не суперпользователь», но я обычно ассоциировал это с EACCES. На самом деле, я не могу вспомнить, что когда-либо видел EPERM в реальной жизни.Разница между EACCES и EPERM

ответ

5

EACCES почти всегда используется, когда системному вызову был передан путь, недоступный для текущего пользователя.

EPERM используется в различных ситуациях, когда вам необходимо быть root для выполнения действия, например.

  • kill() о процессе, который вы не владеете
  • link() на каталог
  • reboot()
+0

Ну, link() в каталоге, как правило, также не разрешено использовать root, но в противном случае этот ответ кажется хорошим. –

+0

@BruceFields Зависит от ОС. Некоторые из них разрешили root каталогов с жесткими ссылками. (Даже не исторически, MacOS активно использует эту функцию для резервного копирования.) – duskwuff

+0

Хорошая точка! Возможно, мне следовало бы сказать: «link() в каталоге возвращает EPERM даже на OS, где hardlinks не разрешено даже root». –

2

Согласно Linux programmers, learn the difference between EACCES and EPERM already! - A Random Dev's Rants ...

  • EACCES "Отказано в доступе" следует использовать для обозначения того, что пользователю не хватает привилегии для выполнения действия. Пользователь root или другой пользователь с достаточными правами пользователя/группы должны иметь возможность выполнить действие.
  • EPERM «Операция не разрешена» должна использоваться для обозначения того, что действие невозможно или безопасно в целом, независимо от того, является ли пользователь root или нет. Примерами могут служить:
    • chmod ИНГ файл на файловой системе FAT (файловая система не поддерживает биты разрешения)
  • Обратите внимание, что много кода Linux возвращает EPERM, когда он должен действительно вернуть EACCES.
+1

В этой записи в блоге нет источников и не согласуется со стандартами. См. http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm. –

+0

@BruceFields: Хм, ты хорошо говоришь. Мне нужно будет изучить это дальше. –