C - использование getrusage для детей пользователя и времени ядра

У меня есть это задание по программированию, в котором мне нужно использовать getrusage, чтобы найти "то, что делают дети", как сказал мой профессор. Я использовал RUSAGE_CHILDREN режим функции getrusage в разделе "по умолчанию" switch(fork()), Мне просто нужно взять ядро ​​и время пользователя.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, const char * argv[]) {

    char **cmd;
    int i = 1;
    pid_t child_pid;
    struct rusage child_ru;

    if (argc == 1){

        perror("No command inserted!\n");
        exit(EXIT_FAILURE);

    } else if(argc == 50){

        perror("No command inserted!\n");
        exit(EXIT_FAILURE);

    }

    cmd = (char **) malloc( (argc) * sizeof(char *));
    cmd[0] = (char *) malloc( strlen(argv[1] + 1 ) * sizeof(char) );
    strcpy(cmd[0], argv[1]);

    if (argc > 2){

        for (i = 1 ; i < argc - 1  ; i++ ){

            cmd[i] = (char *) malloc( strlen(argv[i+1] + 1 ) * sizeof(char) );
            strcpy(cmd[i], argv[i+1]);

        }

    }

    cmd[i] = NULL;

    switch (child_pid = fork()) {
        case -1:
            perror("Error in fork()!\n");
            break;

        case 0:
            execvp(cmd[0], cmd);

            perror("Failed Execution or not existing command!!\n");
            exit(EXIT_FAILURE);

        default:
            printf("Command PID: %ld", (long)child_pid);
            if(wait(NULL) ==-1)
                perror("Error in wait()\n");

            if (getrusage(RUSAGE_CHILDREN, &child_ru) == -1)
                perror("Error in getrusage()\n");

            printf("\n");
            printf("CPU time: %lld.%lld sec\n", (long long)child_ru.ru_utime.tv_sec,(long long)child_ru.ru_utime.tv_usec);
            printf("Kernel time: %lld.%lld sec\n", (long long)child_ru.ru_stime.tv_sec, (long long)child_ru.ru_stime.tv_usec);
            break;

    }

    return 0;
}

Это моя программа. Я всегда получаю время ядра меньше времени пользователя, даже для команды ввода / вывода, поэтому я думаю, что где-то есть ошибка, но я не знаю, где она, я впервые использую getrusage.

0 ответов

Другие вопросы по тегам