プロセス内で実行されているすべてのスレッドのIDを取得する移植可能な方法。

プロセス内で実行されているすべてのスレッドのIDを取得する移植可能な方法。

LinuxからFreeBSDへのアプリケーションの移植中に、次の問題が発生しました。私のアプリケーションで実行されているすべてのスレッドのすべてのスレッドIDを取得する必要があります。 PThreadsの場合、pthread_tシグナルを送信するには、プログラム(PThreadsまたはOpenMP)のすべてのスレッドを含む配列インスタンスが必要です。pthread_signal現在のLinux実装では、プロセスのすべてのPIDを取得するためにprocfをナビゲートする移植不可能な解決策を使用しています。

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ごとにすべてのスレッドにシグナルを送信します。明らかに、これはlinprocfsFreeBSDにインストールしても以下を提供しないので、移植可能なソリューションではありません。仕事目次。

だから私が探しているのは、同様の情報を得るための移植可能な方法を提供するルーチン/インターフェース/ライブラリ/システムコールです。またはpid_t好ましくはpthread_t

答え1

FreeBSDからスレッドのリストを取得するには、次のコマンドを実行します。sysctl(3)。 OIDはCTL_KERN、、、KERN_PROCですKERN_PROC_ALL

関連情報