C语言 当 tid 状态更改时获取信号



有一种方法可以查看pid/tid状态何时随waitpid而变化,但这是阻塞功能。

我想监视特定 pid 中的所有线程,并在其中一个线程更改并打印 tid 时获得信号。

现在,我将线程作为该进程中的线程计数打开,每个 1 在 1 tid 上waitpid,在该阻塞函数完成后,我打印了更改的 tid。

我怎样才能获得 tid 更改的信号,以便我可以在 1 个线程中监控所有 tid。

我不想只监视系统中的所有 pid/tid。

这些花絮/PID不是我过程的孩子。

你可以调用

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

等待任何子进程更改。 因此,您不必事先指定要监视的 pid,并且可以对任何状态更改做出反应。这样,您就不需要为每个 pid 启动一个线程。

至于问题的信号部分:当子进程退出时,会将SIGCHLD发送到您的进程。默认情况下会忽略此信号,但当然,您可以为其安装自定义信号处理程序。

如果你只想收获特定的pid,linux提供了选项WNOWAIT,它只报告状态,但并不真正收获子进程。现在,您可以检查 pid 是否是您要监视的 pid 之一,如果是,请再次调用waitpid()而不使用该选项。

如果进程不是子进程,则通常不能使用waitpid()。一种选择是,如果这些进程之一退出,则与ptrace()附加到这 40 个进程以获取信号。但是,这可能会产生不必要的副作用。

如果您使用的是 POSIX 线程,那么您可以使用pthread_cleanup_pushpthread_cleanup_pop在线程退出时调用"清理"函数。

然后这个"清理"函数可以将一个用户信号(SIGUSR1SIGUSR2(发送到进程,然后进程捕获它并将其视为线程终止的信号。

如果使用sigqueue则可以为信号处理程序添加线程 id,以便它知道刚刚退出的线程。

您可以使用pthread_sigmask阻止所有线程中的用户信号,以确保它仅传递到主进程线程(或使用pthread_sigqueue专门发送到主进程线程(。

最新更新