检查pthread在Linux C中是否仍处于活动状态

检查pthread在Linux C中是否仍处于活动状态,c,linux,pthreads,C,Linux,Pthreads,我知道有人问过类似的问题,但我认为我的情况有点不同。我需要检查子线程是否处于活动状态,以及是否未打印错误消息。子线程应该一直运行。所以基本上我只需要非块pthread_连接,在我的例子中没有竞争条件。子线程可以被终止,所以当它完成时,我不能从子线程设置某种共享变量,因为在这种情况下不会设置它 终止子线程可以这样做: 杀死-9名儿童 编辑:好吧,这个例子是错误的,但我仍然确信存在以某种方式杀死特定线程的方法 编辑:我这样做的动机是在我的应用程序中实现另一个需要此检查的安全层。尽管这个检查可以绕过,

我知道有人问过类似的问题,但我认为我的情况有点不同。我需要检查子线程是否处于活动状态,以及是否未打印错误消息。子线程应该一直运行。所以基本上我只需要非块pthread_连接,在我的例子中没有竞争条件。子线程可以被终止,所以当它完成时,我不能从子线程设置某种共享变量,因为在这种情况下不会设置它

终止子线程可以这样做:

杀死-9名儿童

编辑:好吧,这个例子是错误的,但我仍然确信存在以某种方式杀死特定线程的方法

编辑:我这样做的动机是在我的应用程序中实现另一个需要此检查的安全层。尽管这个检查可以绕过,但那是另一回事


编辑:假设我的应用程序是作为逆向工程学生的演示。他们的任务是破解我的应用程序。但我在子线程中设置了一些反黑客/反调试障碍。我想确保这根线是活的。正如在一些评论中提到的——在不扰乱父母的情况下杀死孩子可能不是那么容易,所以也许这个检查是不必要的。主线程中也存在安全检查,但这次我需要将它们添加到另一个线程中,以使主线程响应。

被什么以及为什么该东西不能指示线程已死亡而终止?但即便如此,这听起来也有点可疑

如果需要检查线程/进程是否处于活动状态,那么这几乎是一个普遍的设计错误——代码中的逻辑应该隐式地处理这个问题

在您的编辑中,您似乎想对线程被完全外部的东西杀死的可能性做些什么

好消息。要做到这一点,就必须让整个过程停止。线程非自愿死亡的所有方式都会杀死进程中的所有线程,除了取消,但只能由同一进程中的其他线程触发。

该命令不会向某些线程发送信号,而是向整个进程发送信号。仔细阅读,仔细阅读

信号和线程不能很好地混合在一起。根据经验,您不希望同时使用这两种方法

顺便说一句,使用
kill-kill
kill-9
是错误的。接收进程没有机会处理
SIGKILL
信号。您应该使用
SIGTERM

如果要在多线程应用程序中处理<代码> SigTale<代码>,请阅读并考虑设置一些信号处理程序的自(并且在某些事件循环中使用)。这一众所周知的伎俩在本书中得到了很好的解释。您也可以考虑Linux特定的SysCal.

如果您考虑使用,您可能不应该在您的情况下使用(但是,将其与0信号一起使用是检查线程是否存在的一种有效但粗糙的方法)。读一些。别忘了给我打电话

子线程应该一直运行

这是错误的方法。您应该知道子线程何时以及如何终止,因为您正在对传递给的函数进行编码,您应该在那里处理所有错误情况,并添加相关的清理代码(可能还有同步)。因此,子线程应该在您希望它运行的时间内运行,并且应该在结束时执行适当的清理操作

还可以考虑其他一些机制(例如,…);它们通常比信号更适合,特别是对于多线程应用。例如,您可以将应用程序设计为某个专门的web或HTTP服务器(使用或其他HTTP服务器库)。然后,您将使用web浏览器、HTTP客户端命令(like)或HTTP客户端库等来驱动多线程应用程序。或者在应用程序中添加一些RPC功能,可能使用

(你假定使用的信号闻起来很糟糕,很可能是一些;考虑使用更好的东西)

我这样做的动机是在我的应用程序中实现另一层安全性


我一点也不明白。信号和线程如何增加安全性?我猜您正在降低软件的安全性

我想确保这个子线程是活的

你不能确定,除了通过良好的编码和避免bug(但是要注意:没有任何可靠的声音来检查)。如果其他东西(例如,其他线程,甚至是你自己的线程中的坏代码)任意修改了你的线程,你已经得到了,而且你可以很好地理解它

在实践中,像
gdb
debugger这样的工具,以及其他编译器,可以帮助找到大多数这样的bug,但是确实存在

也许你想利用,但是你应该放弃你的多方法,并考虑一些方法。根据定义,线程与同一线程的其他线程共享大量资源(尤其是它们的资源)。所以你问题中提到的安全检查没有多大意义。我猜他们正在添加更多的代码,但只是降低了安全性(因为你会有更多的bug)

读一本像这样的教科书应该是值得的。

你可以用它来检查线程是否存在

简介

#include <signal.h>

int pthread_kill(pthread_t thread, int sig);

不过,正如其他地方的人所说,它并不是很有用,而且作为任何类型的安全措施,它都很弱。任何有权限杀死线程的东西都能阻止它运行,而不会杀死它,或者使它运行任意代码,这样它就不会做你想做的事。

我会考虑不同的设计。你可以有一些线程,例如通过改变(在某些互斥锁下)一个全局标志来结束。但是我不需要结束任何线程。我只是想确保我的从线程仍然活着,并在它死后做一些错误处理(不使用从线程)。在你的问题中展示一些。你需要提高你的能力
int rc = pthread_kill( thread_id, 0 );
if ( rc != 0 )
{
    // thread no longer exists...
}