getreport
не может читать с терминала, потому что это фоновый процесс.
человек 2 прочитал
:
EIO: ошибка ввода-вывода.
Это произойдет, например, когда процесс находится в группе фоновых процессов, пытается читать со своего управляющего терминала и либо игнорирует, либо блокирует SIGTTIN, либо его группа процессов осиротела.
Думаю, то, что вы хотите, невозможно без оболочки. Но, возможно, это ближе к тому, что вы хотите:
mkfifo fifo; read -p "Input for FIFO: " input; echo "$input">fifo &
cat <(read bginput <fifo; echo "$bginput"); rm fifo
Это явно не работает для неправильных паролей и повторных попыток чтения.
mkfifo fifo; read -p "Input for FIFO: " input; echo "$input">fifo &
processreport -i <(getreport <fifo); rm fifo
Такая информация доступна через подсистему /sys/class/drm
. Такие инструменты, как xrandr
, широко используют его. Теперь, в частности, для каждого дисплея в этой подсистеме есть каталог с файлом edid
, Расширенные данные идентификации дисплея .
В системах на базе Debian -доступно два пакета: edid-decode
и read-edid
. Оба работают нормально, но на старых и устаревших моделях read-edid
работает достаточно хорошо, тогда как edid-decode
возвращает ошибки:
EDID block does NOT conform to EDID 1.3!
Detailed block string not properly terminated
EDID block does not conform at all!
Bad year of manufacture
Поэтому я бы рекомендовал установить пакет read-edid
. После установки используйте команду parse-edid
, как показано ниже :
$ parse-edid < /sys/class/drm/card0-HDMI-A-1/edid
Checksum Correct
Section "Monitor"
Identifier "X20G-NagaIII"
ModelName "X20G-NagaIII"
VendorName "SPT"
# Monitor Manufactured week 42 of 2005
# EDID version 1.3
# Digital Display
DisplaySize 410 310
Gamma 2.20
Option "DPMS" "true"
Horizsync 30-92
VertRefresh 40-86
# Maximum pixel clock is 170MHz
Другая команда get-edid
предназначена для подключения к шине i2c и автоматически определяет, какие дисплеи подключены и какие данные доступны. Теперь, конечно, это не метод C++, но эти два инструмента, вероятно, написаны на C. Посмотрите на их исходный код и обратите внимание, какие библиотеки они используют.
У меня было два монитора Dell U3014, которые были почти идентичными (никакой разницы в синтаксическом анализе -выводе edid ), но я мог видеть разные серийные номера при проверке файла edid для 5-го и 6-го портов дисплея:
# Compare edid output
diff -a /sys/class/drm/card0-DP-{5,6}/edid
1c1
PT�K���qO�@�����h��@.`0 6��!�P1V6N45V001L
---
PT�K���qO�@�����h��@.`0 6��!�P1V6N45V002L
4c4
< ��P� # �:�q8-@X,E��!�q X,%��!�rQ� n(U��!�
---
> ��P� # �:�q8-@X,E��!�q X,%��!�rQ� n(U��!�
# Better view of just serial numbers:
grep -ao 'P1V6N45V00.L' /sys/class/drm/card0-DP-*/edid
/sys/class/drm/card0-DP-5/edid:P1V6N45V001L
/sys/class/drm/card0-DP-6/edid:P1V6N45V002L
Также следует отметить, что карта 0 -DP была помечена как 1 -8, где, как и в arandr, они были указаны как 0 -7. Таким образом, чтобы сопоставить edid с arandr, вы вычитаете один :DP -5=DP -4 и DP -6=DP -5.