#include #include #include #include #include #include #include #define usage() \ printf("Usage: %s [-F filename] [-M freememory] \ [-P percentage_of_occupation] \n",argv[0]); \ exit(1); void signal_handler(int signal); /* * Define command line args */ extern int optind; extern int optopt; extern int opterr; extern char *optarg; int fd; /* FILE *fd */ static int F_flag, M_flag, P_flag = 0; size_t length; caddr_t map; char *filename; int main(int argc, char **argv) { int opt; struct sigaction generic_sigaction; ulong freemem; double percent; pid_t pid; while ((opt = getopt(argc, argv, "M:P:F:")) != EOF) { switch (opt) { case 'F': /* give a filename to be mapped*/ F_flag++; filename = optarg; case 'M': /* free memory */ M_flag++; freemem = atol(optarg); break; case 'P': /* allocate to a % of free memory */ P_flag++; percent = atof(optarg); break; default: usage(); break; } } if (P_flag) { if (percent>=100) percent/=100; length=freemem*percent; } else { length = freemem*0.90; /* by default 90% of the free memory will be occupied */ } if (!F_flag) { usage(); } file_create(length); if ((map = mmap(NULL, length, PROT_WRITE | PROT_READ, MAP_FILE | MAP_SHARED, fd, 0)) == (caddr_t) -1) { perror(" mmap failed "); cleanup(-1); } pid = fork(); if (pid == (pid_t) -1) { perror("fork failed"); cleanup(-1); } else if (pid != 0) { close(fd); exit(0); } sleep(2); generic_sigaction.sa_handler = signal_handler; sigfillset(&generic_sigaction.sa_mask); generic_sigaction.sa_flags = 0; sigaction(SIGINT, &generic_sigaction, NULL); sigaction(SIGSEGV, &generic_sigaction, NULL); sigaction(SIGBUS, &generic_sigaction, NULL); while (1) {} cleanup(0); } void signal_handler(int signal) { munmap(map, length); cleanup(1); } cleanup(int code) { close(fd); remove(filename); exit(code); } file_create(ulong size) { ulong i; if ((fd = open(filename, O_CREAT | O_EXCL | O_RDWR, 0700)) != -1 ) { for (i=0; i<(size/10); i++) { write(fd, "0123456789", 10); } for (i=0; i<(size%10); i++) { write(fd, "1", 1); } fsync(fd); return(fd); } else { perror("open failed"); return(-1); } }