프로세스 내에서 실행 중인 모든 스레드의 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.

관련 정보