【问题标题】:Linux: detect at runtime that a process have multiple threadsLinux:在运行时检测一个进程有多个线程
【发布时间】:2011-05-06 18:28:08
【问题描述】:

我问的是最近使用 glibc 的 linux。

有没有办法检测该进程由 1 个线程或多个线程组成?

线程可以由 pthread 或裸 clone() 创建,所以我需要一些相当通用的东西。

UPD:我想从它本身检测当前进程的线程。

【问题讨论】:

  • 在您自己的程序中还是在外部?
  • 我不得不问:为什么你还不知道?是图书馆之类的东西在幕后打开它们吗?
  • 鸭子,这段代码会放在.so库中,可以链接到各种程序中,无论是基于pthread还是基于clone的线程。
  • 我认为如果你的库依赖于知道这一点,它就不会很健壮。现在可能只有一个线程,但很快就会开始另一个线程。您打算多久检查一次?

标签: linux multithreading pthreads glibc


【解决方案1】:

检查目录 /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 获取信息,我需要很多系统调用:opendir/readdir。有没有更简单的方法?
  • @osgx:您可以通过一个系统调用来完成 - 只需 stat("/proc/self/task") 并检查是否有 st_nlink &gt; 3
  • caf,谢谢,但 procfs 是否维护 dirs 的 inode 链接计数?你检查这个方法吗?
  • @caf,在我的系统上,如果我在 stat 之前不执行 ls /proc/self/task 或 ps axm,则 proc/self/task 的 stat 返回 3 个 nr_links 而不是 4...跨度>
  • @osgx:对我来说在内核 2.6.32 上运行良好 - 你确定你没有竞争条件吗?
【解决方案2】:

我想您可以运行“ps”(通过 popen() 或类似方法)并解析其输出,然后查看您的进程 ID(由 getpid() 返回)在输出中出现了多少次。可能有更好的方法,但这是首先想到的。

【讨论】:

  • 不,拜托,没有任何子进程开始:)。它太慢了,我需要一个快速的方法,比如 1 个系统调用或一些标志读取等等..
【解决方案3】:

/proc 是在 Linux 中执行此操作的标准方法。 'ps' 之类的工具通过 /proc 工作。在 Linux 2.6 中,您可以在 /proc/self/stat 中找到线程数,但这并不向后兼容。

【讨论】:

    【解决方案4】:

    Victor 的回答肯定是最快的,尽管您可能想考虑改用 ps 库。

    Ubuntu下的名字是libprocps3-dev所以你使用安装它使用:

    sudo apt-get install libprocps3-dev
    

    标题位于/usr/include/proc

    请注意,该库通过读取 /proc 来工作。所以它和直接读取感兴趣的文件是一样的,只是它会知道不同版本之间的差异,并在后台为你处理。

    详情请见http://procps.sourceforge.net/index.html

    【讨论】:

    • procps 会执行多少系统调用来回答“进程由 1 个线程或多于 1 个线程”的问题?
    • 在主要的答案上,我看到很多人问兼容性问题。 procps 肯定很慢,但应该在新旧版本的 Linux 上透明地工作。这取决于您是否需要速度或长期兼容性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    相关资源
    最近更新 更多