причина сбоя операции ввода-вывода файла = -1 EACCES (разрешение отклонено)

Я нахожусь в середине ошибки в своей программе, и я сузил ее с использованием strace до следующей ошибки –

open("/sys/class/gpio/gpio17/value", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = -1 EACCES (Permission denied) open("/sys/class/gpio/gpio17/direction", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = -1 EACCES (Permission denied) 

Для получения справочной информации вы можете прочитать эту тему здесь – https://stackoverflow.com/questions/39524234/bug-with-writing-to-file-in-linux-sys-class-gpio

У меня 3 отдельных прогона моего теста, один нормальный, один с указанным sudo и другой с преднамеренной задержкой. Вот соответствующие результаты трассы этих трасс –

Normal

 open("/sys/class/gpio/export", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/unexport", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/export", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/gpio17/value", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = -1 EACCES (Permission denied) open("/sys/class/gpio/gpio17/direction", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = -1 EACCES (Permission denied) open("/sys/class/gpio/unexport", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 

sudo

 open("/sys/class/gpio/export", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/unexport", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/export", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/gpio17/value", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/gpio17/direction", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 4 open("/sys/class/gpio/unexport", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 

Delayed

 ("/sys/class/gpio/export", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/unexport", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/export", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/gpio17/value", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 open("/sys/class/gpio/gpio17/direction", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 4 open("/sys/class/gpio/unexport", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 

Теперь я попытался найти эту ошибку , но все, что я нашел, это ошибки javascript, android или nodejs без ссылки на исходное описание. Любая информация была бы очень полезной для меня, поэтому спасибо за вашу помощь 🙂

EDIT. Если это актуально, я использую это как правило udev в /etc/udev/rules.d/99-com.rules

 SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0660" SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'" SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'" 

и ls -l output –

 total 0 --w--w---- 1 root gpio 4096 Sep 16 07:13 export lrwxrwxrwx 1 root root 0 Sep 16 07:13 gpio17 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio17 lrwxrwxrwx 1 root root 0 Jul 31 05:23 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0 --w--w---- 1 root gpio 4096 Sep 16 06:50 unexport 

текущий пользователь также входит в группу gpio.

One Solution collect form web for “причина сбоя операции ввода-вывода файла = -1 EACCES (разрешение отклонено)”

Я был бы готов вкладывать деньги в это условие гонки между вашей программой и udev .

По-видимому, /sys/class/gpio/gpio17/value и /sys/class/gpio/gpio17/direction создаются в некоторый момент после open("/sys/class/gpio/export", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 , и изначально они, вероятно, принадлежат root:root , без доступа на запись для вашего обычного пользователя.

Затем правило udev запускается и udev вызывает sh для установки разрешений, но это занимает некоторое время; если вы попробуете следующий open() раньше, он терпит неудачу.

Я не знаю, есть ли способ подождать, пока udev закончит без опроса.

  • Как настроить sudoers, чтобы разрешить запуск команды sudo под другой группой и именем пользователя?
  • Почему этот каталог не добавляется в мой PATH, когда я использую sudo?
  • Как отредактировать файл как root?
  • su options - запуск команды в качестве другого пользователя
  • Почему по умолчанию пользователь Debian не входит в список sudoer?
  • Не могу дать себе NOPASSWD privelege для chmod / chown
  • Bash, выполнить команду после вызова новой оболочки
  • Gnome update-notifier не показывает обновления, если пользователь не в группе sudo (Debian Squeeze)
  • Получение sudo для работы с псевдонимом
  • ssh как суперпользователь
  • Какие плохие вещи могут произойти, если мы не будем использовать sudoedit?
  • Невозможно установить или загрузить что-либо в груше 8
  • Linux и Unix - лучшая ОС в мире.