2010-10-27 2 views
1

Мне нужна аналогичная функция, аналогичная функции VC++ GetThreadTimes() для работы в Solaris. Мне нужен инструмент мониторинга для мониторинга потока и мониторинга времени выполнения из другого потока. Есть ли прямой способ сделать это?GetThreadTimes on Solaris 10 x86 C++

Я обнаружил, что getrusage() может сделать это только для получения значения times() для вызывающей нити. Но я хочу, чтобы следить за временем потока из другого потока. Моей последней целью является изменение реализации CreateThread(), чтобы hardwire обработчик sig к потоку, который должен быть выполнен. И используйте sighandler, чтобы захватить данные для меня. Но я пока не знаю, будет ли это работать.

ответ

1

В Solaris вы можете сделать это с помощью mmaping/Proc/PID/LWP/LWPID/lwpstatus

Простой пример:

#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; 
} 

Вот это первый поток текущего процесса, но любые значения PID и LWPID могут использоваться, если у вас есть достаточный доступ, и они существуют.

Это нормально работает на моей тестовой машине Solairs (SunOS wiked 5.10 Generic_142900-13 sun4v sparc SUNW, T5140).

Я попытался использовать mmap для этого примера, но получил «операцию не применимо», возвращенную от вызова, поэтому отказался и использовал вместо этого чтение.

+0

man -s4 proc дает более подробную информацию об информации из/proc – Flexo

+0

Разбор файлов в/proc кажется самым элегантным решением. Я изначально имел это в виду, но не знал, как это сделать. Большое спасибо. – marcus

Смежные вопросы