Linux进程ID和线程ID

时间:2011-12-19 18:43:48

标签: c++ c linux process pthreads

假设我们在Linux上运行了许多用户进程。每个进程都有许多线程在运行。

我可以通过调用getpid()来获取进程ID,其返回值是一个整数。

我可以通过调用pthread_self()来获取线程ID,其返回值是一个名为pthread_t的opaque类型。

现在我需要在共享内存中存储进程ID(一个int,通常是4个字节)和线程ID(pthread_t,需要计算出多少字节),以便以后可以使用这两个部分ID信息用于标识该特定线程并检查该线程是否仍在运行。

我发现许多在线来源pthread_t投放unsigned intunsigned long。由于我不想在转换过程中丢失任何数据,我应该如何处理pthread_t数据,以便它是一个固定大小的数据(如上所述,我需要将线程信息存储在共享内存中)

另外,我应该如何通过进程ID和线程ID的组合来识别该特定线程?如何检查线程是否仍在运行?

4 个答案:

答案 0 :(得分:4)

如果要将pid_tpthread_t存储在任何位置,则应使用各自的类型(即“pid_t”和“pthread_t”)。因此,如果您想将它们存储在某个地方的共享内存中,请执行memcpy()将它们放在那里。

至于通过PID和TID的组合识别特定线程,请参阅Nemo的评论。

如果您确实假设它们将存在,您可以让程序查看/proc以查找相应的pid目录,并在/proc/<pid>/task中查找线程。

答案 1 :(得分:3)

您可以使用pthread_join作为检测完成的粗略方式,但我确信这不是您想要的。相反,您必须通过创建线程完成标志来自行处理。设置此标志的一种好方法是在pthread清理处理程序中。请参阅此相关post

答案 2 :(得分:2)

为什么不将它们装在struct

typedef struct
{
    int procID;
    pthread_t threadID;

} ProcThreadID;

不用担心pthread_t的特定基础类型(毕竟我们在C中,所以一切都是POD,可以用memcpy盲目复制。)

您可以使用sizeof运算符轻松获取其大小:

size_t ptIDSize = sizeof(ProcThreadID);

您可以使用简单的memcpy将其复制到任意位置。

答案 3 :(得分:0)

命令让进程中的线程ID运行
$ ps -eLf | grep 14965

UID PID PPID LWP C NLWP STIME TTY TIME CMD
root 14965 14732 14965 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14966 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14967 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14968 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14969 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14970 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14971 0 201 15:28 pts/10 00:00:00 ./a.out
root 14965 14732 14972 0 201 15:28 pts/10 00:00:00 ./a.out


这里第4列(LWP)显示了ID为14965的所有正在运行的线程