我在用最近的 glibc 询问 linux。
有没有办法检测该进程由 1 个线程或多个线程组成?
线程可以由 pthread 或裸 clone() 创建,所以我需要一些相当通用的东西。
UPD:我想从它本身检测当前进程的线程。
我在用最近的 glibc 询问 linux。
有没有办法检测该进程由 1 个线程或多个线程组成?
线程可以由 pthread 或裸 clone() 创建,所以我需要一些相当通用的东西。
UPD:我想从它本身检测当前进程的线程。
检查目录 /proc/YOUR_PID/task/ 是否仅包含一个子目录。如果您有多个线程在处理中,则会有多个子目录。
硬链接计数可用于计算子目录。此函数返回当前线程数:
#include <sys/stat.h>
int n_threads(void)
{
struct stat task_stat;
if (stat("/proc/self/task", &task_stat))
return -1;
return task_stat.st_nlink - 2;
}
/proc 是在 Linux 中执行此操作的标准方法。'ps' 之类的工具通过 /proc 工作。在 Linux 2.6 中,您可以在 /proc/self/stat 中找到线程数,但这不是向后兼容的。
我想您可以运行“ps”(通过 popen() 或类似方法)并解析其输出,然后查看您的进程 ID(由 getpid() 返回)出现在输出中的次数。可能有更好的方法,但这是首先想到的。
Victor 的答案肯定是最快的,尽管您可能想考虑使用 ps 库。
Ubuntu下的名称是libprocps3-dev
这样你使用安装它使用:
sudo apt-get install libprocps3-dev
标题位于/usr/include/proc
.
请注意,该库通过读取 /proc 来工作。因此,它与直接读取感兴趣的文件相同,只是它会知道各个版本之间的差异并为您处理这些问题。
有关详细信息,请参阅http://procps.sourceforge.net/index.html。