1 /*
2 * pipe1.c
3 *
4 * $DragonFly: src/test/sysperf/pipe1.c,v 1.1 2003/08/12 02:29:44 dillon Exp $
5 */
6
7 #include <sys/types.h>
8 #include <sys/wait.h>
9 #include "blib.h"
10
11 int
main(int ac,char ** av)12 main(int ac, char **av)
13 {
14 long long count = 0;
15 long long max;
16 char c[1];
17 int j;
18 int loops;
19 int fds[2];
20
21 printf("tests full duplex pipe 1write,2read,2write,1read loop\n");
22 if (pipe(fds)) {
23 perror("pipe");
24 exit(1);
25 }
26 if (fork() == 0) {
27 /*
28 * child process
29 */
30 close(fds[0]);
31 while (read(fds[1], c, sizeof(c)) == sizeof(c)) {
32 write(fds[1], c, sizeof(c));
33 }
34 _exit(0);
35 } else {
36 /*
37 * parent process.
38 */
39 close(fds[1]);
40 write(fds[0], c, sizeof(c)); /* prime the caches */
41 read(fds[0], c, sizeof(c));
42
43 start_timing();
44 for (j = 0; ; ++j) {
45 write(fds[0], c, sizeof(c));
46 if (read(fds[0], c, sizeof(c)) != sizeof(c)) {
47 fprintf(stderr, "broken pipe during test\n");
48 exit(1);
49 }
50 if ((j & 31) == 0 && stop_timing(0, NULL))
51 break;
52 }
53 loops = j;
54
55 start_timing();
56 for (j = 0; j < loops; ++j) {
57 write(fds[0], c, sizeof(c));
58 if (read(fds[0], c, sizeof(c)) != sizeof(c)) {
59 fprintf(stderr, "broken pipe during test\n");
60 exit(1);
61 }
62 }
63 stop_timing(j, "full duplex pipe / 1char:");
64 close(fds[0]);
65 while(wait(NULL) >= 0);
66 }
67 return(0);
68 }
69
70