gpt4 book ai didi

linux - 杀死一个 tid 不会返回错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:58 25 4
gpt4 key购买 nike

当 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 小 1。如果你然后杀了 tid

kill -0 <tid>

tid 将响应并且从 kill 返回的错误将为 0。我的问题是我有一个运行很长时间的程序并且没有被重写的选项。它跟踪它曾经启动的所有进程。由于进程 ID 环绕,TID 有时会替换原来的 PID。该程序使用“kill(0, PID)”来检查进程是否正在运行。由于 TID 将捕获 kill,这就像进程仍然存在一样,即使它早已退出。

最佳答案

将旧 PID 重用于新线程 TID 与将 PID 重用于新进程 PID 的情况没有什么不同。如果您的进程依赖于使用 kill(0, pid) 进行轮询以查看进程何时退出,则两者都是完全可能的 - 该方法具有固有的竞争条件。

您的进程应该使用 waitpid() 系统调用,可能与 SIGCHLD 处理程序配对,以跟踪其子进程的退出。

关于linux - 杀死一个 tid 不会返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40558367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com