有一种方法可以查看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_push
和pthread_cleanup_pop
在线程退出时调用"清理"函数。
然后这个"清理"函数可以将一个用户信号(SIGUSR1
或SIGUSR2
(发送到进程,然后进程捕获它并将其视为线程终止的信号。
如果使用sigqueue
则可以为信号处理程序添加线程 id,以便它知道刚刚退出的线程。
您可以使用pthread_sigmask
阻止所有线程中的用户信号,以确保它仅传递到主进程线程(或使用pthread_sigqueue
专门发送到主进程线程(。