在将应用程序从 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 { …
Run Code Online (Sandbox Code Playgroud)