Как Linux отличает потоки от дочерних процессов?

Зависит от того, сколько у вас времени. Если вы знаете C, то самый безопасный способ - это подключиться с помощью gdb к процессу ssh-agent (должен быть root) и распечатать ключевые данные. Идентификационные ключи хранятся в массиве под названием idtable, который содержит связанный список идентификационных данных. Таким образом, вы можете вывести BIGNUM данные (как определено в (1)), например:

(gdb) call BN_bn2hex(idtable[2]->idlist->tqh_first->key->rsa->n)

где число 2 - версия (вероятно, вам нужно 2), а последний элемент - один из BIGNUM (остальные - движок, e, d, p, q, dmp1, dmq1, iqmp).

Теперь, чтобы использовать эти данные, вам нужно написать небольшую утилитную программу, в которой вы определяете RSA-структуру (определенную как в (1)) и заполняете их. Возможно, Вы могли бы написать другую утилиту, чтобы сделать это автоматически, но тогда Вам понадобится больше времени, Вы можете просто распечатать данные вручную. Затем вы вызываете функцию PEM_write_RSAPrivateKey (2) с приведенными выше RSA-данными и получаете новый незашифрованный rsa-файл.

Приносим извинения за отсутствие подробностей, но если у вас есть время, то это может быть отправной точкой.

(1) /usr/include/openssl/rsa.h

(2) см. страницу man для pem(3)

.
22
28.03.2018, 16:42
3 ответа

С точки зрения task_structпотоки процесса имеют одного и того же лидера группы потоков(group_leaderв task_struct), тогда как дочерние процессы имеют разных лидеров группы потоков (для каждого отдельного дочернего процесса ).

Эта информация предоставляется пользовательскому пространству через файловую систему /proc. Вы можете отследить родителей и детей, взглянув на поле ppidв /proc/${pid}/statили .../status(, это дает родительский pid ); вы можете отслеживать потоки, глядя на поле tgidв .../status(. Это дает идентификатор группы потоков, который также является pid лидера группы ). Потоки процесса становятся видимыми в каталоге /proc/${pid}/task:, каждый поток получает свой собственный подкаталог. (Каждый процесс имеет по крайней мере один поток.)

На практике программы, желающие отслеживать свои собственные потоки , будут полагаться на API-интерфейсы, предоставляемые библиотекой потоков, которые они используют, а не на информацию, специфичную для ОС -. Обычно в Unix -подобных системах это означает использование pthreads.

32
27.01.2020, 19:42
  1. Запускает команду topс некоторыми дополнительными параметрами:

    top -H -b -n 1
    
    • Аргумент -Hуказывает top отображать каждый отдельный поток. Обычно top суммирует все потоки родительского процесса.
    • Аргумент -bзапускает top в пакетном режиме — информация собирается, отображается, а затем выгружается на стандартный вывод, в отличие от запуска в интерактивном режиме и обновления отображаемых данных.
    • С опцией -bпользователь должен сообщить top, сколько раз запускать, это делается с помощью аргумента -nи последнего аргумента, сколько раз запускать.

    Итак, top -H -b -n 1указывает системе «запускать сверху, отображать отдельные потоки, запускать в пакетном режиме и запускать только один раз».

  2. Команда psсоздает снимок текущих запущенных процессов.

    ps -eLf
    

    Аргумент -eLf(можно использовать как -e -L -f, а )разбивается следующим образом:

    • eуказывает psотображать все процессы независимо от того, кто ими владеет, или их текущего состояния — активны, спящие, приостановлены, ожидают ввода-вывода и т. д.
    • Lуказывает psпоказывать отдельные потоки
    • fуказывает psформатировать вывод как полный -формат листинга, а в сочетании с аргументом Lчисло потоков NLWP ()и поток LWP (К выходным данным добавляются столбцы ID ).
6
27.01.2020, 19:42

Рассмотрим процесс с PID p1

Объект task_structдочернего процесса будет иметь PPID (родительского PID )как p1, а его PID и TGID установлены, скажем, на p2.

Объект task_structпотока p1 будет иметь PID, установленный, скажем, p3, но TGID, установленный на p1.

1
27.01.2020, 19:42

Теги

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