Чтение из нескольких источников ввода и применение настраиваемых действий требует 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
.
Эти потоки используются для дискового кеша 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
В Linux программа на C или C++ может использовать pthread _setname _np (3)-с помощью prctl (2)системный вызов -для изменить название темы.
Если разработчик вашего двоичного файла (или библиотеки, используемой вашей программой, такой как libSDL ), решил вызвать эту функцию, обычно это удается.
Вы можете использовать gdb (1 ), strace (1 ), ltrace (1 ), чтобы исследовать больше. Или изучите исходный код libSDL
.Если вы используете компилятор GCC , скомпилируйте код C++ с помощьюg++ -Wall -Wextra -g
(и, возможно, перекомпилируйте libSDL из его исходного кода и, по крайней мере, изучите его исходный код, поскольку это открытый исходный код ).