#include #include #include #include #include #include #include #include int size = 1; char *buf; char synchronize[] = "Rendezvous"; void test(int scenario) { int i, fd; struct stat sb; while (stat(synchronize, &sb) == 0) sched_yield(); if (scenario == 1) { for (i = 0; i < 100000; i++) { if ((fd = open("/dev/zero", O_RDONLY)) == -1) err(1, "open(/dev/zero)"); if (read(fd, buf, size) != size) err(1, "read(/dev/zero)"); close(fd); } for (i = 0; i < 100000; i++) { if ((fd = open("/dev/null", O_WRONLY)) == -1) err(1, "open(/dev/null)"); if (write(fd, buf, size) != size) err(1, "write(/dev/null)"); close(fd); } } if (scenario == 2) { if ((fd = open("/dev/zero", O_RDONLY)) == -1) err(1, "open(/dev/zero)"); for (i = 0; i < 2000000; i++) { if (read(fd, buf, size) != size) err(1, "read(/dev/zero)"); } close(fd); if ((fd = open("/dev/null", O_WRONLY)) == -1) err(1, "open(/dev/null)"); for (i = 0; i < 2000000; i++) { if (write(fd, buf, size) != size) err(1, "write(/dev/null)"); } close(fd); } if (scenario == 3) { for (i = 0; i < 200000; i++) { if ((fd = open("/dev/zero", O_RDONLY)) == -1) err(1, "open(/dev/zero)"); if (read(fd, buf, size) != size) err(1, "read(/dev/zero)"); close(fd); } } exit(0); } int main(int argc, char **argv) { int i, fd, scenario; if (argc != 2) errx(1, "Usage: %s {1|2|3}", argv[0]); scenario = atoi(argv[1]); if (scenario < 1 || scenario > 3) errx(1, "Bad scenario: %s", argv[1]); buf = malloc(size); if ((fd = open(synchronize, O_CREAT | O_TRUNC | O_RDWR, 0640)) == -1) err(1, synchronize); close(fd); for (i = 0; i < 20; i++) { if (fork() == 0) test(scenario); } unlink(synchronize); for (i = 0; i < 20; i++) wait(NULL); return (0); }