繁体   English   中英

Linux进程ID和线程ID

[英]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 intunsigned long 由于我不想在转换期间丢失任何数据,我应该如何处理pthread_t数据,以便它是一个固定大小的数据(如上所述,我需要将线程信息存储在共享内存中)。

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

如果要将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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM