при печати Я просто получаю 0. Не вижу проблемы ..
tms_stime
- время, затрачиваемое процессором в ядре от имени процесса. pause()
ничего не делает, поэтому он не учитывается для процессорного времени, signal
и times
не требуют вычислений - ваша программа ничего не делает. Выполните некоторые операции ввода-вывода, заставьте это ядро работать, чтобы увидеть некоторые изменения во времени.
Например, следующая программа читает 400000000 байт из /dev/urandom
:
#include <time.h>
#include <sys/times.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
struct tms time_end;
void handle() {
times(&time_end);
}
int main(int argc, char *argv[]) {
signal(SIGINT, handle);
// read from urandom so that kernel has to generate randomness
FILE *f = fopen("/dev/urandom", "r");
for (int i = 0; i < 20000000; ++i) {
char buf[20];
fread(buf, sizeof(buf), 1, f);
}
fclose(f);
pause();
printf("tms_stime = %ld\n", (long)time_end.tms_stime);
return 0;
}
Сохраняется как 1.c
и выполняется в моей системе в выводах оболочки:
$ sh -c 'gcc 1.c ; ./a.out & child=$!; sleep 2; kill -INT $child ; wait'
tms_stime = 127
На linux есть также CLOCK_PROCESS_CPUTIME_ID
, которые могут вас заинтересовать.