#include #include #include #include #include #include #include int main(int argc, char **argv, char **envp) { unsigned long loops; struct { unsigned long parent; unsigned long child; } *err; if (argc < 3) { printf("usage: %s LOOPS CMD [ARGS]\n", argv[0]); exit(1); } loops = strtoul(argv[1], NULL, 0); err = mmap(NULL, sizeof(*err), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); if (err == MAP_FAILED) { printf("failed to create shared mapping (%s)\n", strerror(errno)); exit(1); } err->parent = err->child = 0; while (loops--) { switch (fork()) { case 0: execve(argv[2], &argv[2], envp); err->child++; exit(1); break; case -1: err->parent++; break; default: wait(NULL); } } if (err->parent || err->child) { printf("fork() errors: %lu\n", err->parent); printf("exec() errors: %lu\n", err->child); } return 0; }