当TID响应kill系统调用时,是否有任何方法可以检测到PID真的死了,然后这个过程仍然存在。
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <ctype.h>
#include <sys/types.h> // gettid()
#include <sys/syscall.h>
static int gettid()
{
return syscall(SYS_gettid);
}
void *start(void *arg)
{
printf("thread start is %d\n", gettid());
(void)arg;
while (1)
{
sleep(1);
}
}
int
main(int argc, char *argv[])
{
pthread_t thread;
printf("Process is %d\n", getpid());
(void)pthread_create(&thread, nullptr, &start, nullptr);
while (1)
{
sleep(1);
// do_kill(thread);
}
}
如果你编译这个
g++ -std=c++11 starttid.cpp -lpthread
并执行pid比tid少一个。如果你然后杀了tid
kill -0 <tid>
tid将响应,kill返回的错误将为0.我的问题是我有一个程序运行很长时间而且没有重写的选项。它跟踪它发起的所有进程。由于进程ID环绕,因此TID有时会替换原始PID。该程序使用&#39; kill(0,PID)&#39;&#39;检查进程是否正在运行。由于TID将捕获kill,因此即使它已经退出很久,这个过程仍然存在。
答案 0 :(得分:0)
重新用于新线程TID的旧PID与针对新进程PID重用的PID不同。如果您的进程依赖于使用kill(0, pid)
进行轮询以查看进程何时退出 - 该方法具有固有的竞争条件,则两者都是完全可能的。
您的进程应使用waitpid()
系统调用,可能与SIGCHLD
处理程序配对,以跟踪其子进程的退出。