Значения struct tms, возвращаемые times(), все ноль или минус
Я пытаюсь реализовать функцию times() в C-программировании.
Я использую struct tms
структура, которая состоит из полей: tms_utime, tms_cutime,
tms_stime и tms_cstime.
Чтобы реализовать функцию times() в моей программе, я делаю:
Прежде чем я разветвляюсь и создаю дочерний элемент, я вызываю функцию times (в родительском процессе).
times(&start_tms);
- Я создаю канал и передаю время начала структуры в канал, когда я нахожусь в дочернем процессе.
- Ребенок выполняет простую
ls -l
команда Когда ребенок заканчивает выполнение, отец во второй раз вызывает функцию times().
times(&end_tms);
К сожалению, времена end_tms все равны нулю! Странно, но я не знаю почему.
Некоторые вещи, которые я не понимаю в моей программе:
1) в первом printfs
времена начала структуры отрицательны. Это почему?
2) Когда я запускаю программу, почему я получаю нули для раз? Что я делаю неправильно?
Моя программа выглядит следующим образом:
Заранее спасибо
#include <sys/times.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main() {
printf("test\n");
int fd[2]; //two pointers
int nbytes;
char string[] = "Hello, world!\n";
char readbuffer[80];
struct tms start_tms;
struct tms end_tms;
clock_t start, end;
double cpu_time_used;
pipe(fd);
//once we have established the pipeline we fork the child
pid_t childpid;
pid_t pid_waitpid;
//NEW MODIFICATION!!! call times before fork()!!!
times(&start_tms);
//they return negative values, but why???
printf("Test start_tms.tms_utime = %f\n\n",start_tms.tms_utime);
printf("Test start_tms.tms_cutime = %f\n\n",start_tms.tms_cutime);
printf("Test start_tms.tms_stime = %f\n\n",start_tms.tms_stime);
if((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
if(childpid == 0)
{
/* Child process closes up input side of pipe */
close(fd[0]);
/* call times function */
/*times(&start_tms);*/
//REMOVED!!!!
//write(fd[1], string, (strlen(string)+1));
write(fd[1], &start_tms.tms_cutime, sizeof(clock_t));
write(fd[1], &start_tms.tms_utime, sizeof(clock_t));
write(fd[1], &start_tms.tms_stime, sizeof(clock_t));
//execute /bin/ls
execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", (char *) 0);
exit(0);
}
else
{
/* Parent process closes up output side of pipe */
close(fd[1]);
/* NEW MODIFICATION, wait for the child!!! */
if( (pid_waitpid = waitpid(childpid,NULL,0) ) == -1)
{
perror("waitpid");
exit(1);
}
/* call times for capturing end times */
times(&end_tms);
/* define t1, t2, variables */
clock_t t1,t2,t3;
//REMOVED!!!!
//nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
read(fd[0], &t1, sizeof(clock_t));
read(fd[0], &t2, sizeof(clock_t));
read(fd[0], &t3, sizeof(clock_t));
printf("Received string: %s\n\n", readbuffer);
printf("Test t1 = %f\n\n",t1);
printf("Test end_tms.tms_utime = %f\n\n",end_tms.tms_utime);
printf("Test end_tms.tms_cutime = %f\n\n",end_tms.tms_cutime);
printf("Test end_tms.tms_stime = %f\n\n",end_tms.tms_stime);
/* Calculate times, unfortunately return zero, but why??? */
double cpu_time = end_tms.tms_cutime - t1;
double utime = end_tms.tms_utime - t2;
double stime = end_tms.tms_stime - t3;
//Unfortunately printfs return zero, but why???
printf("cpu time %f\n\n",cpu_time);
printf("cpu Utime %f\n\n",utime);
printf("cpu Stime %f\n\n",stime);
}
}
1 ответ
Твоя логика очень странная. Записи, которые вы делаете в дочернем элементе, просто копируют данные, которые уже доступны родительскому элементу в start_tms
, так что вся ваша труба для чтения / записи не нужна.
Во-вторых, clock_t
это не тип с плавающей запятой, это целочисленный тип. Вы не можете использовать %f
распечатать это. использование %jd
а также intmax_t
быть в безопасности в printf
s.
А ты скучаешь #include <sys/wait.h>
для ожидания Так что включите предупреждения вашего компилятора и прочитайте их.
Вот версия вашего кода на C99, которая работает здесь:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <inttypes.h>
#include <sys/wait.h>
#include <sys/times.h>
#include <sys/types.h>
int main() {
struct tms start_tms;
struct tms end_tms;
//once we have established the pipeline we fork the child
pid_t childpid;
times(&start_tms);
printf("Test start_tms.tms_utime = %jd\n\n", (intmax_t)start_tms.tms_utime);
printf("Test start_tms.tms_cutime = %jd\n\n", (intmax_t)start_tms.tms_cutime);
printf("Test start_tms.tms_stime = %jd\n\n", (intmax_t)start_tms.tms_stime);
printf("Test start_tms.tms_cstime = %jd\n\n", (intmax_t)start_tms.tms_cstime);
if((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
if(childpid == 0)
{
//execute /bin/ls
execl("/bin/ls", "/bin/ls", "-R", "-t", "-l", (char *) 0);
exit(0);
}
else
{
/* Parent process */
/* NEW MODIFICATION, wait for the child!!! */
if (waitpid(childpid,NULL,0) == -1)
{
perror("waitpid");
exit(1);
}
/* call times for capturing end times */
times(&end_tms);
printf("Test end_tms.tms_utime = %jd\n\n",end_tms.tms_utime);
printf("Test end_tms.tms_cutime = %jd\n\n",end_tms.tms_cutime);
printf("Test end_tms.tms_stime = %jd\n\n",end_tms.tms_stime);
printf("Test end_tms.tms_cstime = %jd\n\n",end_tms.tms_cstime);
/* Calculate times, unfortunately return zero, but why??? */
clock_t cpu_time = end_tms.tms_cutime - start_tms.tms_cutime;
clock_t utime = end_tms.tms_utime - start_tms.tms_utime;
clock_t stime = end_tms.tms_stime - start_tms.tms_stime;
clock_t cstime = end_tms.tms_cstime - start_tms.tms_cstime;
//Unfortunately printfs return zero, but why???
printf("cpu time %jd\n\n", (intmax_t)cpu_time);
printf("cpu Utime %jd\n\n", (intmax_t)utime);
printf("cpu Stime %jd\n\n", (intmax_t)stime);
printf("cpu CStime %jd\n\n", (intmax_t)cstime);
}
}
Если у вас нет intmax_t
проверьте размер clock_t
на вашей реализации и найдите стандартный целочисленный тип, который соответствует ему, и используйте соответствующую строку формата в вашем printf
звонки.