Maneira portátil de obter todos os ids de thread em execução dentro de um processo.

3

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 .

    
por M.K. aka Grisu 07.11.2017 / 11:31

0 respostas