[英]Linux process ID and thread ID
假设我们在Linux上运行了许多用户进程。 每个进程都有许多线程在运行。
我可以通过调用getpid()
来获取进程ID,其返回值是一个整数。
我可以通过调用pthread_self()
获取线程ID,其返回值是一个名为pthread_t
的opaque类型。
现在我需要在共享内存中存储进程ID(一个int,通常是4个字节)和线程ID( pthread_t
,需要计算出多少字节),这样我以后可以使用这两个ID信息来识别特定的线程并检查线程是否仍在运行。
我发现许多在线资源将pthread_t
转换为unsigned int
或unsigned long
。 由于我不想在转换期间丢失任何数据,我应该如何处理pthread_t
数据,以便它是一个固定大小的数据(如上所述,我需要将线程信息存储在共享内存中)。
另外,我应该如何通过进程ID和线程ID的组合来识别该特定线程? 如何检查线程是否仍在运行?
如果要将pid_t
和pthread_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
这里第4列(LWP)显示了ID为14965的正在运行的所有线程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.