Linux进程ID和线程ID

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

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

我可以通过调用pthread_self()来获得线程ID,其返回值是一个不透明的types,称为pthread_t

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

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

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

如果你想在任何地方存储pid_tpthread_t ,你应该使用它们各自的类型(即“pid_t”和“pthread_t”)。 所以如果你想将它们存储在共享内存中,可以使用memcpy()来获取它们。

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

如果你确实假设它们将存在,你可以让你的程序看看/proc来找到合适的pid的目录,并在/proc/<pid>/task查找线程。

您可以使用pthread_join作为检测完成的粗略方法,但是我相信这不是您想要的。 相反,你必须通过创建一个线程完成标志来处理这个问题。 设置这个标志的好方法是在pthread清理处理程序中。 看到这个相关的职位

你为什么不把它们打包在一个struct

 typedef struct { int procID; pthread_t threadID; } ProcThreadID; 

而不用担心pthread_t的具体底层类型(毕竟我们在C中,所以一切都是POD,并且可以用memcpy盲目地复制)。

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

 size_t ptIDSize = sizeof(ProcThreadID); 

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

命令来获取线程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

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