Это представляет bitmask
для событий, поддерживаемых устройством.
Образец devices
запись для Клавиатуры AT:
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input2
U: Uniq=
H: Handlers=sysrq kbd event2
B: PROP=0
B: EV=120013
B: KEY=20000 200 20 0 0 0 0 500f 2100002 3803078 f900d401 feffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7
B
впереди обозначает bitmap
, N
, P
, S
, U
, H
просто первая буква в соответствующем значении имени и I
для ID
. Заказанным способом:
I => @id: id of the device
(struct input_id)
Bus => id.bustype
Vendor => id.vendor
Product => id.product
Version => id.version
N => name of the device.
P => physical path to the device in the system hierarchy.
S => sysfs path.
U => unique identification code for the device (if device has it).
H => list of input handles associated with the device.
B => bitmaps
PROP => device properties and quirks.
EV => types of events supported by the device.
KEY => keys/buttons this device has.
MSC => miscellaneous events supported by the device.
LED => leds present on the device.
Поскольку Вы знаете компьютерное соглашение в двоичном файле, таким образом:
1 = 0001
2 = 0010
3 = 0011
4 = 0100
5 = 0101
...
Таким образом, если у меня есть битовый массив со значением 5
тот содержал бы биты 0 и 2 в другом слове, можно дать каждому числу имя и проверить, соответствуют ли они значению.
Например.
A = 1, 001
B = 2, 010
C = 4, 100
Затем, если я имею MYVAR = 5
который является 101
в двоичном файле это проверило бы:
MYVAR & A == TRUE (101 & 001 => 001)
MYVAR & B == FALSE (101 & 010 => 000)
MYVAR & C == TRUE (101 & 100 => 100 )
Таким образом мой var имеет A и C.
Ядро использует немного более сложный/сложный путь и биты набора смещением. Так как одна причина состоит в том, что больше битов затем доступно в одном компьютере (ЦП), целое число используется. Например, посмотрите на KEY
битовый массив.
Так, если мы говорим:
A = 0
B = 1
C = 6
...
И затем
target = 0;
set_bit(A, target); => target == 0001
set_bit(C, target); => target == 0100 0001
120013
Значение 120013
шестнадцатеричное. Как двоичный файл это дает нам:
0x120013 == 0001 0010 0000 0000 0001 0011 binary
1 2 0 0 1 3
Пронумерованный от права они:
2 1 <= offset (10's)
3210 9876 5432 1098 7654 3210 <= offset (counted from right)
0001 0010 0000 0000 0001 0011 <= binary
Set bits are:
0, 1, 4, 17, 20
Затем проверьте input.h
Вы находите, что они соответствуют:
0 EV_SYN (0x00)
1 EV_KEY (0x01)
4 EV_MSC (0x04)
17 EV_LED (0x11)
20 EV_REP (0x14)
Для проверки, что они имеют в виду, краткое введение дано Документацией ядра.
* EV_SYN:
- Used as markers to separate events. Events may be separated in time or in
space, such as with the multitouch protocol.
* EV_KEY:
- Used to describe state changes of keyboards, buttons, or other key-like
devices.
* EV_MSC:
- Used to describe miscellaneous input data that do not fit into other types.
* EV_LED:
- Used to turn LEDs on devices on and off.
* EV_REP:
- Used for autorepeating devices.
Это, "РЕДАКТИРОВАНИЕ 2 (продолжалось)": в частности, мог бы представлять интерес.
Опция -0 / - NULL
Сначала был представлен 28-10-2009 и выпустить с GNU Coreutils версии 8.1.
Если ваши коретилы слишком старые, вы должны обновить. Или вы можете использовать Perl
Perl
:
perl -e '$ENV{_}="/usr/bin/env"; print "$_ => $ENV{$_}\0" for keys %ENV'
Как @ Stéphane Chazelas указывал в своем комментарии, приведенный выше подход не включает среда строки, которые не содержат =
, дублированные переменные среды или переменные среды с нулевым именем.
Если вы находитесь в Linux, вы можете снова использовать (спасибо @ Stéphane Chazelas снова):
cat /proc/self/environ
Если вы работаете с питоном, вы можете использовать:
import os
import sys
for k in sorted(os.environ):
if k == '_':
v = '/usr/bin/env'
else:
v = os.environ[k]
sys.stdout.write("{}={}\0".format(k, v))
для получения очень похожих результатов по сравнению с env --null
.