2010-10-27 14 views
1

Je souhaite qu'une fonction similaire à la fonction VC++ GetThreadTimes() fonctionne sur Solaris. J'ai besoin d'un outil de surveillance pour surveiller le thread et surveiller le temps d'exécution d'un autre thread. Y a-t-il un moyen direct de faire cela?GetThreadTimes sous Solaris 10 x86 C++

J'ai trouvé que getrusage() peut le faire seulement pour obtenir la valeur de times() pour le thread appelant. Mais je ce que je veux faire est surveiller les temps de fil d'un autre fil. Mon dernier recours consiste à modifier l'implémentation de CreateThread() pour connecter un gestionnaire sig au thread à exécuter. Et utilisez le sighandler pour récupérer les données pour moi. Mais je n'ai pas encore d'idée si cela fonctionnera.

Répondre

1

Sur Solaris, vous pouvez le faire en mmaping/proc/PID/js/LWPID/lwpstatus

Exemple simple:

#define _STRUCTURED_PROC 1 

#include <sys/time.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/procfs.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <assert.h> 

int main() { 
    const time_t start = time(NULL); 
    while (time(NULL) - start < 10); 
    int fd = open("/proc/self/lwp/1/lwpstatus", O_RDONLY); 
    assert(fd >= 0); 
    lwpstatus_t status; 
    const ssize_t ret = read(fd, &status, sizeof(lwpstatus_t)); 
    close(fd); 
    assert(sizeof(lwpstatus_t) == ret); 
    printf("User CPU time: %ld\n", status.pr_utime.tv_sec); 
    printf("System time: %ld\n", status.pr_stime.tv_sec); 
    return 0; 
} 

Voici c'est le premier fil du processus en cours, mais les valeurs de PID et LWPID peuvent être utilisés à condition que vous ayez un accès suffisant et qu'ils existent.

Cela a fonctionné correctement sur ma machine d'essai de Solairs (SunOS a pédalé 5.10 Generic_142900-13 sun4v sparc SUNW, T5140).

J'ai essayé d'utiliser mmap pour cet exemple, mais j'ai reçu une "opération non applicable" renvoyée par l'appel, j'ai donc abandonné et utilisé la lecture à la place.

+0

man -s4 proc donne plus de détails sur les informations de/proc – Flexo

+0

L'analyse des fichiers dans/proc semble être la solution la plus élégante. À l'origine, j'avais cela en tête, mais je ne savais pas comment m'y prendre. Merci beaucoup awoodland. – marcus