Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Время выполнения программы

11K
08 апреля 2008 года
zuze
84 / / 07.03.2008
У меня есть код и я хочу узнать его время выполнения, но вместо того чтобы время показывало один раз, оно показывает два раза.

Помогите пожалуйста, что я сделал не так?

Вот код

Код:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/times.h>

int main()
{
    int fd;
    pid_t childpid;
    size_t size;
    char readbuffer[14];
    struct tms tms_stop,  tms_start;
    clock_t real_stop, real_start, HZ;

    HZ = sysconf(_SC_CLK_TCK);
    real_start = times(&tms_start);

    (void)umask(0);
    if (mknod("my.fifo", S_IFIFO | 0666, 0) < 0)
    {
        printf("Can\'t create FIFO\n");
        exit(-1);
    }
    if ((childpid = fork()) == -1)
    {
       printf("Can\'t fork child\n");
       exit(-1);
    }
    if (childpid > 0)
    {
       if ((fd = open("my.fifo", O_WRONLY)) < 0)
       {
          printf("Can\'t open FIFO for writing\n");
            exit(-1);
       }
       size = write(fd, "Hello, world!", 14);
       if (size != 14)
       {
          printf("Can\'t write all string to FIFO\n");
          exit(-1);
       }
        close(fd);
    }
    else
    {
        if ((fd = open("my.fifo", O_RDONLY)) < 0)
        {
           printf("Can\'t open FIFO for reading\n");
           exit(-1);
        }


        size = read(fd, readbuffer, 14);
        if (size < 0)
        {
           printf("Can\'t read string\n");
           exit(-1);
        }
        printf("\n%s\n", readbuffer);
        close(fd);
    }
    real_stop = times(&tms_stop);
    printf("Time runing program: %g seconds\n", (real_stop - real_start) / (double)HZ);
    return 0;
}


Результат работы программы

[root@localhost root]# ./prog
Time runing program: 0.06 seconds

Hello, world!
Time runing program: 0.08 seconds
[root@localhost root]#
2
08 апреля 2008 года
squirL
5.6K / / 13.08.2003
код разделяется на родителя и потомка. printf("Time runing program: %g seconds\n", (real_stop - real_start) / (double)HZ);
выполняется и в родителе, и в потомке. что не ясно то? :)
11K
08 апреля 2008 года
zuze
84 / / 07.03.2008
Значит общее время выполнения программы будет сложение времён?
361
08 апреля 2008 года
Odissey_
661 / / 19.09.2006
Нет =) ... Хотя конечно смотря как и что вы оцениваете.
В общем случае, ну поразмыслите сами, две части программы выполняются одновременно, в какой момент можно сказать что программа "в целом" завершилась? Видимо ж когда завершатся все ее части, то есть когда закончит работу самая долгая ее часть.
11K
08 апреля 2008 года
Free Thinker
118 / / 16.03.2007
Цитата: zuze
Значит общее время выполнения программы будет сложение времён?



Нет. Как уже сказал squirL, после fork ты получаешь два процесса - родитель и потомок. Каждый из них продолжает выполнять код, соответственно происходит два printf - по одному на процесс.

И вообще, RTFM (man fork).

11K
08 апреля 2008 года
zuze
84 / / 07.03.2008
Всё проблема решена.

Вот код

Код:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/times.h>

int main()
{
    int fd;
    pid_t childpid;
    size_t size;
    char readbuffer[14];
    struct tms tms_stop,  tms_start;
    clock_t real_stop, real_start, HZ;

    HZ = sysconf(_SC_CLK_TCK);

    (void)umask(0);
    if (mknod("my.fifo", S_IFIFO | 0666, 0) < 0)
    {
        printf("Can\'t create FIFO\n");
        exit(-1);
    }
    if ((childpid = fork()) == -1)
    {
       printf("Can\'t fork child\n");
       exit(-1);
    }
    if (childpid > 0)
    {
       real_start = times(&tms_start);
       waitpid(childpid, 0, 0);
       if ((fd = open("my.fifo", O_WRONLY)) < 0)
       {
          printf("Can\'t open FIFO for writing\n");
            exit(-1);
       }
       size = write(fd, "Hello, world!", 14);
       if (size != 14)
       {
          printf("Can\'t write all string to FIFO\n");
          exit(-1);
       }
        close(fd);
        real_stop1 = times(&tms_stop1);
        printf("Time runing program: %g seconds\n", ((real_stop1 -
        real_start1) / (double)HZ));
    }
    else
    {
        if ((fd = open("my.fifo", O_RDONLY)) < 0)
        {
           printf("Can\'t open FIFO for reading\n");
           exit(-1);
        }


        size = read(fd, readbuffer, 14);
        if (size < 0)
        {
           printf("Can\'t read string\n");
           exit(-1);
        }
        printf("\n%s\n", readbuffer);
        close(fd);
    }
    real_stop = times(&tms_stop);
    printf("Time runing program: %g seconds\n", (real_stop - real_start) / (double)HZ);
    return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог