获取进程内运行的所有线程 ID 的可移植方法。

获取进程内运行的所有线程 ID 的可移植方法。

在将应用程序从 Linux 移植到 FreeBSD 期间,我遇到了以下问题。我需要获取应用程序中运行的所有线程的所有线程 ID。就 PThreads 而言,我需要一个数组实例,其中包含程序中的所有线程(PThreads 或 OpenMP)以向它们pthread_t发送信号。pthread_signal当前的 Linux 实现使用不可移植的解决方法,通过遍历 procfs 来获取进程的所有 pid:

int foreach_pid(void (*func)(pid_t, void *aux),void*aux){
 DIR *proc_dir;
 char dirname[256];
 pid_t pid;
 if ( ! func ) return -1;

 snprintf(dirname, sizeof(dirname), "/proc/%d/task", getpid());
 proc_dir = opendir(dirname);

 if (proc_dir) {
    /*  /proc available, iterate through tasks... */
    struct dirent *entry;
    while ((entry = readdir(proc_dir)) != NULL) {
        if(entry->d_name[0] == '.')
            continue;
        pid = atoi(entry->d_name);
        func(pid, aux);
    }
    closedir(proc_dir);
    return 0;
 } else {
    return -1;
 }
}

并使用该kill函数通过进程 ID 将信号发送到所有线程。显然,这不是一个可移植的解决方案,因为即使linprocfs安装在 FreeBSD 下,它也不提供任务目录。

所以我正在寻找的是一个例程/一个接口/一个库/一个系统调用,以提供一种可移植的方式来获取类似的信息。要么作为pid_t,要么优选作为pthread_t

答案1

获取 FreeBSD 上的线程列表是通过以下命令完成的sysctl(3)。 OID 是CTL_KERN, KERN_PROC, KERN_PROC_ALL

相关内容