Получить сигнал при изменении статуса TID - PullRequest
0 голосов
/ 13 февраля 2020

Есть способ посмотреть, когда статус pid / tid изменяется с waitpid, но это функция блокировки.

Я хочу отслеживать все потоки в указанном c pid и получать сигнал, когда один из них измените и распечатайте tid.

Пока я открываю нити как количество потоков в этом процессе, и каждый 1 делает waitpid на 1 tid, и после этой функции блокировки fini sh я печатаю этот tid, который изменился.

Как я могу получить сигнал об изменении тида, чтобы я мог отслеживать все тиды в 1 потоке.

Я не хотел отслеживать все пид в системе, указав c pid / tid .

Эти приливы и отливы не являются детьми моего процесса.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Если вы используете потоки POSIX, то вы можете использовать pthread_cleanup_push и pthread_cleanup_pop для вызова функции «очистки» при выходе из потока.

Эта «очистка» "Функция может затем отправить один из пользовательских сигналов (SIGUSR1 или SIGUSR2) процессу, который затем перехватывает его и обрабатывает как сигнал о завершении потока.

Если вы используете sigqueue вы можете добавить идентификатор потока для обработчика сигнала, чтобы он знал, какой поток только что вышел.

Вы можете использовать pthread_sigmask, чтобы заблокировать сигнал пользователя во всех потоках, чтобы убедиться, что он доставляется только в основной поток процесса (или используйте pthread_sigqueue для конкретной отправки в основной поток процесса).

0 голосов
/ 13 февраля 2020

Вы можете позвонить

int status;
pid_t waitpid(-1, &status, 0);

, чтобы дождаться любого изменения дочернего процесса. Таким образом, вам не нужно заранее указывать, какой pid следует отслеживать, и вы можете реагировать на любое изменение статуса. Таким образом, вам не нужно запускать один поток для каждого pid.

Что касается сигнальной части вашего вопроса: SIGCHLD отправляется вашему процессу при выходе из дочернего процесса. Этот сигнал по умолчанию игнорируется, но вы, конечно, можете установить для него специальный обработчик сигнала.

Если вы хотите только получить указанные c pids, linux предоставляет параметр WNOWAIT, который только сообщает о состоянии, но на самом деле не пожинает дочерний процесс. Теперь вы можете проверить, является ли pid одним из тех, которые вы хотите отслеживать, и если это так, снова вызвать waitpid() без опции.

Если процессы не являются дочерними, waitpid() нельзя использовать в генеральный. Один из вариантов - присоединить с помощью ptrace() к этим 40 процессам, чтобы получить сигнал, если один из этих процессов завершится. Однако это может иметь нежелательные побочные эффекты.

...