причина сбоя операции ввода-вывода файла = -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.

  • Как войти в систему как root из Bash и делать что-то
  • Отрицательные / недопустимые настройки Ubuntu без полномочий root sudo
  • Опция NOPASSWD не применяется к второй команде
  • Песочница учетная запись и предотвратить ее от любых изменений системы
  • sed и sudo с заменой строки
  • Предпочитаете sudo over su, используя отдельного пользователя с полными привилегиями sudo?
  • разрешить пользователю chroot?
  • Не могу дать себе NOPASSWD privelege для chmod / chown
  • 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 закончит без опроса.

    Linux и Unix - лучшая ОС в мире.