Что это за потоки с именами disk$0, disk$1 и т. д.?

Чтение из нескольких источников ввода и применение настраиваемых действий требует awk. Вы можете просто сделать это как

awk 'FNR==NR{pidMap[$2]=$1; next}$3 in pidMap{$3=pidMap[$3]}1' <(echo "$PKG_PID_LIST") <(logcat)

<()— это синтаксис, предоставляемый оболочкой bash, которая запускает команду внутри и делает вывод команды таким, как если бы она отображалась в файле. В качестве содержимого второго файла мы делаем так, чтобы вывод logcatотображался там. Итак,awkпытается прочитать из двух входных потоков.

Логика FNR==NRв awk, используемая при одновременном чтении из более чем одного входного потока. FNRи NR— это специальные переменные, которые отслеживают номера строк в файле и во всем входном потоке. Таким образом, с условием FNR==NRмы в основном определяем действие после него в пределах {..}для выполнения над первым файлом и после него над вторым.

Таким образом, в первом файле -, таком как поток, мы видим вывод PKG_PID_LIST, из которого мы создаем карту хэша -с ключом в качестве идентификатора процесса -и именем процесса в виде Значение. Как только мы закончим обработку этого файла, мы сопоставим все PID с их именами.

Во втором файле мы используем эту карту $3 in pidMap, что означает:значение $3во втором потоке присутствует как только что обработанный ключ, мы обновляем $3во втором потоке($3-в третьем столбце с разделителями-пробелами )как сопоставленное значение для ключа. {..}1— это действие в awk, в котором мы даем ему указание реконструировать строку на основе выполненных модификаций (, если модификаций нет, вывести строку как таковую ).


Если ваш logcatпостоянно производит вывод, и вы хотите запустить эту команду после того, как вывод установлен, то я предлагаю сначала записать вывод во временный файл, а затем передать этот файл как второй. аргумент в awk.

2
24.08.2020, 02:25
2 ответа

Эти потоки используются для дискового кеша mesa:

   util_queue_init(&cache->cache_queue, "disk$", 32, 4,
                   UTIL_QUEUE_INIT_RESIZE_IF_FULL |
                   UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY |
                   UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY);

https://sources.debian.org/src/mesa/20.2.4-1/src/util/disk_cache.c/?hl=388#L388

А внутри util_queue_init()то:

   /* Form the thread name from process_name and name, limited to 13
    * characters. Characters 14-15 are reserved for the thread number.
    * Character 16 should be 0. Final form: "process:name12"
    *
    * If name is too long, it's truncated. If any space is left, the process
    * name fills it.
    */

https://sources.debian.org/src/mesa/20.2.4-1/src/util/u_queue.c/?hl=398#L406

Таким образом, все процессы GUI, которые так или иначе вызывают этот код мезы, создают эти дополнительные потоки, например. на моей настольной системе f33:

    pid     tid            comm cls
   1942    1989  gnome-s:disk$0 BAT 
   1942    1990  gnome-s:disk$1 BAT 
   1942    1991  gnome-s:disk$2 BAT 
   1942    1992  gnome-s:disk$3 BAT 
   2041    2237  Xwaylan:disk$0 BAT 
   2041    2238  Xwaylan:disk$1 BAT 
   2041    2239  Xwaylan:disk$2 BAT 
   2041    2240  Xwaylan:disk$3 BAT 
   2041    2259  Xwaylan:disk$0 BAT 
   2041    2260  Xwaylan:disk$1 BAT 
   2041    2261  Xwaylan:disk$2 BAT 
   2041    2262  Xwaylan:disk$3 BAT 
   2292    2325  gsd-xse:disk$0 BAT 
   2292    2326  gsd-xse:disk$1 BAT 
   2292    2327  gsd-xse:disk$2 BAT 
   2292    2328  gsd-xse:disk$3 BAT 
   2307    2344  ibus-x1:disk$0 BAT 
   2307    2345  ibus-x1:disk$1 BAT 
   2307    2346  ibus-x1:disk$2 BAT 
   2307    2347  ibus-x1:disk$3 BAT 
   2464    2578  firefox:disk$0 BAT 
   2464    2579  firefox:disk$1 BAT 
   2464    2580  firefox:disk$2 BAT 
   2464    2581  firefox:disk$3 BAT 
   2756    2785  firefox:disk$0 BAT 
   2756    2786  firefox:disk$1 BAT 
   2756    2787  firefox:disk$2 BAT 
   2756    2788  firefox:disk$3 BAT 
   2806    2841  firefox:disk$0 BAT 
   2806    2842  firefox:disk$1 BAT 
   2806    2843  firefox:disk$2 BAT 
   2806    2844  firefox:disk$3 BAT 
   2919    3078  firefox:disk$0 BAT 
   2919    3079  firefox:disk$1 BAT 
   2919    3080  firefox:disk$2 BAT 
   2919    3081  firefox:disk$3 BAT 
   3346    3367  firefox:disk$0 BAT 
   3346    3368  firefox:disk$1 BAT 
   3346    3369  firefox:disk$2 BAT 
   3346    3370  firefox:disk$3 BAT 
   3408    3426  firefox:disk$0 BAT 
   3408    3427  firefox:disk$1 BAT 
   3408    3428  firefox:disk$2 BAT 
   3408    3429  firefox:disk$3 BAT 
   5794    5825  firefox:disk$0 BAT 
   5794    5826  firefox:disk$1 BAT 
   5794    5827  firefox:disk$2 BAT 
   5794    5828  firefox:disk$3 BAT 
   6345    6364  firefox:disk$0 BAT 
   6345    6365  firefox:disk$1 BAT 
   6345    6366  firefox:disk$2 BAT 
   6345    6367  firefox:disk$3 BAT 
   9502    9525  firefox:disk$0 BAT 
   9502    9526  firefox:disk$1 BAT 
   9502    9527  firefox:disk$2 BAT 
   9502    9528  firefox:disk$3 BAT 
  22548   22565  firefox:disk$0 BAT 
  22548   22566  firefox:disk$1 BAT 
  22548   22567  firefox:disk$2 BAT 
  22548   22568  firefox:disk$3 BAT 
  33788   33807      vlc:disk$0 BAT 
  33788   33808      vlc:disk$1 BAT 
  33788   33809      vlc:disk$2 BAT 
  33788   33810      vlc:disk$3 BAT 
  48178   74574  kwallet:disk$0 BAT 
  48178   74575  kwallet:disk$1 BAT 
  48178   74576  kwallet:disk$2 BAT 
  48178   74577  kwallet:disk$3 BAT 
  60824   60830  chromiu:disk$0 BAT 
  60824   60831  chromiu:disk$1 BAT 
  60824   60832  chromiu:disk$2 BAT 
  60824   60833  chromiu:disk$3 BAT 
  69502   69519  firefox:disk$0 BAT 
  69502   69520  firefox:disk$1 BAT 
  69502   69521  firefox:disk$2 BAT 
  69502   69522  firefox:disk$3 BAT
2
18.03.2021, 23:10

В Linux программа на C или C++ может использовать pthread _setname _np (3)-с помощью prctl (2)системный вызов -для изменить название темы.

Если разработчик вашего двоичного файла (или библиотеки, используемой вашей программой, такой как libSDL ), решил вызвать эту функцию, обычно это удается.

Вы можете использовать gdb (1 ), strace (1 ), ltrace (1 ), чтобы исследовать больше. Или изучите исходный код libSDL

.

Если вы используете компилятор GCC , скомпилируйте код C++ с помощьюg++ -Wall -Wextra -g(и, возможно, перекомпилируйте libSDL из его исходного кода и, по крайней мере, изучите его исходный код, поскольку это открытый исходный код ).

0
18.03.2021, 23:10

Теги

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