Чому я можу вставити в цей файл лише додатні цілі числа?


1

Якщо я передаю рядок, що складається лише з натурального числа /sys/class/backlight/intel_backlight/brightness, це працює. Але якщо я передаю рядок, що містить щось інше, що я спробував, я отримую повідомлення про помилку:

$ sudo su -c "echo 10 >/sys/class/backlight/intel_backlight/brightness"
$ sudo su -c "echo -- -1 >/sys/class/backlight/intel_backlight/brightness"
bash: line 0: echo: write error: Invalid argument
$ sudo su -c "echo aa >/sys/class/backlight/intel_backlight/brightness"
bash: line 0: echo: write error: Invalid argument
$ sudo su -c "echo 10.2 >/sys/class/backlight/intel_backlight/brightness"
bash: line 0: echo: write error: Invalid argument

Я спершу подумав, що це якийсь спеціальний файл, але, здається, це звичайний файл:

$ file /sys/class/backlight/intel_backlight/brightness
/sys/class/backlight/intel_backlight/brightness: ASCII text

Що відбувається?


2
Це sysfs; Я думаю, що повинен був бути дублікат цього питання, але я досі не знайшов його.
Майкл Гомер

1
Насправді не дублікат, але дивіться мою відповідь на це питання . Підсумовуючи, у користувальній області виконується звичайна програма ядра, яка аналізує і перевіряє, що надсилає файл.
grochmal

Дякую. Чи приводить код, який аналізує і перевіряє те, що я передаю у файл, що працює в просторі користувача, причиною того, що повідомлення про помилку визначає як належне echo? Коли я це роблю echo aueu > /dev/sda, я отримую bash: /dev/sda: Permission denied, тому це не говорить про те, що він належить до echoцього випадку (що я вважаю більш логічним на даний момент). Яку функцію здійснює перевірка в просторі користувача? Чи перевірено це знову в просторі ядра? Якщо я спробую зберегти недійсне значення за допомогою Emacs, я отримую Write error: invalid argument, /sys/[...]/brightness, btw.
UTF-8,

Так, код ядра (можливо, kstrtoulу функції bl_power_storeу файлі drivers/video/backlight/backlight.c) генерує помилку, яка є результатом системного виклику запису при виконанні echo. Permission deniedпомилки також генеруються ядром, але на рівні файлової системи вже при спробі відкрити файл, набагато раніше, і з різним кодом обробки помилок у bash.
dirkt

"генерує помилку" Так що взагалі немає перевірки простору користувача? Тому що якби він був, виконання було б скасовано до того, як ядро ​​долучиться, чи не так?
UTF-8,

Відповіді:


1

Ви можете записувати в цей файл лише негативні цілі числа, оскільки це спеціальний файл, а ядро ​​відкидає будь-який інший вхід. Це не спеціальний файл у сенсі того, що він має особливий тип файлу, але це спеціальний файл, оскільки він знаходиться в спеціальній файловій системі. Коли ви отримуєте доступ до «звичайної» файлової системи, ядро ​​зберігає вміст файлу на диску, не інтерпретуючи їх. Але коли ви отримуєте доступ до файлів у розділі /proc( procfs ) або /sys( sysfs ), дані не зберігаються на диску, доступ викликає спеціальний код ядра. Для такого файлу, як /sys/class/backlight/intel_backlight/brightnessцей спеціальний код, потрібно ціле число від 0 до деякого, що залежить від апаратного максимуму, і якщо ви намагаєтесь написати що-небудь інше, writeвиклик не вдається зі статусом помилки EINVAL.


Приємна відповідь, але максимальне значення не може бути 100, оскільки поточне значення мого ноутбука - це 248. Я думаю, що максимальне значення - це те, що є, /sys/class/backlight/intel_backlight/max_brightnessі це 976 на моєму ноутбуці.
UTF-8

@ UTF-8 Ви маєте рацію, max_brightnessнасправді залежить від обладнання, я змішав це з параметром, до xbacklightякого нормалізується значення 0–100.
Жиль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.