#define _GNU_SOURCE #include #include #include #include #include #include #include #include void recursive_fork(size_t size) { pid_t pid; while ((pid = fork() == 0)) { if (size) { void *buf; buf = malloc(size); if (!buf) { perror("malloc error"); exit(-errno); } memset(buf, 0, size); free(buf); } } if (pid < 0) { perror("fork error(child)"); exit(-errno); } exit(0); } void usage(const char *cmd) { fprintf(stderr, "Usage: %s [-c ] [-s ] [-p ]\n", cmd); exit(-1); } int main(int argc, char *argv[]) { pid_t pid; int opt; unsigned int numchild = 1; size_t alloc_size = 0; char path[64]; int fd; while ((opt = getopt(argc, argv, "c:s:p:")) != -1) { switch (opt) { case 'c': numchild = atoi(optarg); break; case 's': alloc_size = atoi(optarg); break; case 'p': snprintf(path, sizeof(path), "%s/tasks", optarg); fd = open(path, O_WRONLY); if (fd < 0) { perror("open error"); exit(-errno); } write(fd, "\0", 1); close(fd); break; default: usage(basename(argv[0])); } } while (numchild--) { pid = fork(); if (pid < 0) { perror("fork error(parent)"); exit(-errno); } if (pid == 0) /* child */ recursive_fork(alloc_size); } return 0; }