Введение ENV - пустой указатель

Это представляет 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 (продолжалось)": в частности, мог бы представлять интерес.

5
23.05.2017, 15:40
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
6
27.01.2020, 20:35

Если вы работаете с питоном, вы можете использовать:

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.

3
27.01.2020, 20:35

Теги

Похожие вопросы