Durante a portabilidade de um formulário de aplicativo Linux para o FreeBSD, eu tive o seguinte problema. Eu preciso obter todos os id do segmento de todos os segmentos em execução dentro do meu aplicativo. Em termos de PThreads, preciso de uma instância de uma matriz pthread_t
que contenha todos os encadeamentos em meu programa (ou PThreads ou OpenMP) para enviar um sinal usando pthread_signal
para eles. A implementação atual do Linux usa uma solução não portátil, percorrendo o procfs para obter todos os pids de um processo:
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;
}
}
e usa a função kill
para enviar os sinais para todos os segmentos através de seus IDs de processo. Obviamente, isso não é uma solução portátil porque, mesmo que linprocfs
esteja montado no FreeBSD, ele não fornece o diretório tarefa .
Então, o que estou procurando é uma rotina / uma interface / biblioteca / syscall para ter uma maneira portátil de obter informações semelhantes. Seja como pid_t
ou preferível como pthread_t
.