#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]#
выполняется и в родителе, и в потомке. что не ясно то? :)
Значит общее время выполнения программы будет сложение времён?
В общем случае, ну поразмыслите сами, две части программы выполняются одновременно, в какой момент можно сказать что программа "в целом" завершилась? Видимо ж когда завершатся все ее части, то есть когда закончит работу самая долгая ее часть.
Цитата: zuze
Значит общее время выполнения программы будет сложение времён?
Нет. Как уже сказал squirL, после fork ты получаешь два процесса - родитель и потомок. Каждый из них продолжает выполнять код, соответственно происходит два printf - по одному на процесс.
И вообще, RTFM (man fork).
Вот код
Код:
#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;
}
#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;
}