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

标签 linux pthreads system-calls

当 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/

相关文章:

C++ 对象层次结构——如何管理循环依赖?

linux - 如何在不使用原始选项的情况下在 CUPS 打印机中打印文本/普通文档

linux - 在后台 EC2 中运行 python 脚本

c - 从文件读取并使用 pthread_create 时出现段错误

linux - 是否可以拦截 Linux 文件系统中文件的统计调用? (来自用户空间)

c - 使用 syscall() 链接 initramfs 中的 key 环

php - 如何从 PHP 中的加密 PDF 中提取标题?

linux - 仅在Linux中打印IP和设备名称

C 程序退出且没有任何输出

通过 void * 转换枚举