杀死一个tid不会返回错误

时间:2016-11-12 00:40:44

标签: 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少一个。如果你然后杀了tid

kill -0 <tid>

tid将响应,kill返回的错误将为0.我的问题是我有一个程序运行很长时间而且没有重写的选项。它跟踪它发起的所有进程。由于进程ID环绕,因此TID有时会替换原始PID。该程序使用&#39; kill(0,PID)&#39;&#39;检查进程是否正在运行。由于TID将捕获kill,因此即使它已经退出很久,这个过程仍然存在。

1 个答案:

答案 0 :(得分:0)

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

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