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별로 모든 스레드에 신호를 보냅니다. 분명히 이것은 linprocfs
FreeBSD에 설치하더라도 다음을 제공하지 않기 때문에 이식 가능한 솔루션이 아닙니다.일목차.
그래서 제가 찾고 있는 것은 비슷한 정보를 얻을 수 있는 이식 가능한 방법을 제공하는 루틴/인터페이스/라이브러리/시스템 호출입니다. 로 pid_t
또는 바람직하게는 pthread_t
.
답변1
FreeBSD에서 스레드 목록을 가져오는 것은 다음 명령으로 수행됩니다.sysctl(3)
. OID는 CTL_KERN
, KERN_PROC
, 입니다 KERN_PROC_ALL
.