#include #include #include #include #include #include void create_load(int iters); void cleanup(); int high_rate = 0; int num_iters = 100000; int fd1; char file1[50]; char file2[50]; char dir1[50]; char symlink1[50]; /* Purpose: To create system load by invoking system calls used by templates. * * Note: The unlink(2) of a file can be an expensive operation (i.e., event * rate goes way down). */ main(int argc, char **argv) { int num_children=1; int iters; int i; char c; while ((c = getopt(argc, argv, "hi:")) != -1) { switch (c) { case 'h': /* * Desire "high" event rate */ high_rate = 1; argc--; break; case 'i': /* * Desire a specified number of iterations */ num_iters = atoi(optarg); argc--; break; default: fprintf(stderr,"Unknown option: %c\n",optarg); exit(1); } } /*if(argv[optind] != NULL) { num_children = atoi(argv[optind]); } else { num_children = 0; } Register cleanup routine */ fprintf(stderr,"Registering cleanup routine...\n"); if (atexit(cleanup) == -1) { fprintf(stderr,"Error calling atexit(), errno=%d(%s)\n", errno,strerror(errno)); exit(1); } /* fork child processes, if any requested */ for(i=1; i < num_children; i++) { if(fork() == 0) { printf("child pid: %d\n",getpid()); /* Setup file names based on child's pid */ sprintf(file1,"./file1_%d",getpid()); sprintf(file2,"./file2_%d",getpid()); sprintf(dir1,"./dir1_%d",getpid()); sprintf(symlink1,"./file1symlink_%d",getpid()); /* each child creates load */ iters=0; if (num_iters == -1) { while(1) { create_load(iters); iters++; if( (iters % 1000) == 0) { printf("pid %d iteration %d\n",getpid(),iters); } } } else { while(iters < num_iters) { create_load(iters); iters++; if( (iters % 1000) == 0) { printf("pid %d iteration %d\n",getpid(),iters); } } } } } /* Parent creates load also */ printf("parent pid: %d\n",getpid()); /* Setup file names based on parent's pid */ sprintf(file1,"./file1_%d",getpid()); sprintf(file2,"./file2_%d",getpid()); sprintf(dir1,"./dir1_%d",getpid()); sprintf(symlink1,"./file1symlink_%d",getpid()); iters=0; if (num_iters == -1) { while(1) { create_load(iters); iters++; if( (iters % 1000) == 0) { printf("pid %d iteration %d\n",getpid(),iters); } } } else { while(iters < num_iters) { create_load(iters); iters++; if( (iters % 1000) == 0) { printf("pid %d iteration %d\n",getpid(),iters); } } } } /* main */ void create_load(int iters) { int pid; char *args[2]; struct stat stat_buf; fd1 = creat(file1,0x644); if (fd1 == -1) { fprintf(stderr,"pid %d: creat() returned error for file %s, errno=%d(%s)\n", getpid(),file1,errno,strerror(errno)); exit(1); } if (close(fd1) == -1) { fprintf(stderr,"pid %d: close() returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } fd1 = open(file1, O_RDWR, 0777); if (fd1 == -1) { fprintf(stderr,"pid %d: open() returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } /* Chown this file to root instead of user ids so that we don't generate a * non-owned alert when the file is truncated when invoking creat() again * as root on an existing file owned by another user. */ if (chown(file1,0,0) == -1) { fprintf(stderr,"pid %d: chown(%d,%d) returned error, errno=%d(%s)\n", getpid(),0,0,errno,strerror(errno)); exit(1); } if (fchown(fd1,0,0) == -1) { fprintf(stderr,"pid %d: fchown(%d,%d) returned error, errno=%d(%s)\n", getpid(),0,0,errno,strerror(errno)); exit(1); } if (chmod(file1, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) == -1) { fprintf(stderr,"pid %d: chmod(S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } if (fchmod(fd1, S_IXUSR|S_IXGRP|S_IXOTH) == -1) { fprintf(stderr,"pid %d: fchmod(S_IXUSR|S_IXGRP|S_IXOTH) returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } if (write(fd1,"Some stuff",strlen("Some stuff")) == -1) { fprintf(stderr,"pid %d: write() returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } if (ftruncate(fd1,7) == -1) { fprintf(stderr,"pid %d: ftruncate() returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } if (close(fd1) == -1) { fprintf(stderr,"pid %d: close() returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } if (truncate(file1,3) == -1) { fprintf(stderr,"pid %d: truncate() returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } if (rename(file1,file2) == -1) { fprintf(stderr,"pid %d: rename(%s,%s) returned error, errno=%d(%s)\n", getpid(),file1,file2,errno,strerror(errno)); exit(1); } if (rename(file2,file1) == -1) { fprintf(stderr,"pid %d: rename(%s,%s) returned error, errno=%d(%s)\n", getpid(),file2,file1,errno,strerror(errno)); exit(1); } if (link(file1,file2) == -1) { fprintf(stderr,"pid %d: link(%s,%s) returned error, errno=%d(%s)\n", getpid(),file1,file2,errno,strerror(errno)); exit(1); } if (symlink(file1,symlink1) == -1) { fprintf(stderr,"pid %d: symlink(%s,%s) returned error, errno=%d(%s)\n", getpid(),file1,symlink1,errno,strerror(errno)); exit(1); } if (lchown(symlink1,0,0) == -1) { fprintf(stderr,"pid %d: lchown(%s,%d,%d) returned error, errno=%d(%s)\n", getpid(),symlink1,0,0,errno,strerror(errno)); exit(1); } if (lstat(symlink1,&stat_buf) == -1) { fprintf(stderr,"pid %d: lstat(%s) returned error, errno=%d(%s)\n", getpid(),symlink1,errno,strerror(errno)); exit(1); } if (stat(file1,&stat_buf) == -1) { fprintf(stderr,"pid %d: stat(%s) returned error, errno=%d(%s)\n", getpid(),file1,errno,strerror(errno)); exit(1); } if (unlink(file1) == -1) { fprintf(stderr,"pid %d: unlink(%s) returned error, errno=%d(%s)\n", getpid(),file1,errno,strerror(errno)); exit(1); } if (unlink(file2) == -1) { fprintf(stderr,"pid %d: unlink(%s) returned error, errno=%d(%s)\n", getpid(),file2,errno,strerror(errno)); exit(1); } if (unlink(symlink1) == -1) { fprintf(stderr,"pid %d: unlink(%s) returned error, errno=%d(%s)\n", getpid(),symlink1,errno,strerror(errno)); exit(1); } if (mkdir(dir1,S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP) == -1) { fprintf(stderr,"pid %d: mkdir() returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } if (rmdir(dir1) == -1) { fprintf(stderr,"pid %d: rmdir() returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } /* Fork every 10000 iterations to not use up process resources too quickly */ if ( (iters % 10000) == 0) { pid = fork(); if(pid == 0) { fprintf(stderr,"child pid %d: fork!\n",getpid()); // child args[0] = "/bin/ls"; args[1] = NULL; close(1); close(2); execve(args[0], args, NULL); fprintf(stderr,"pid %d: execve(%s) returned error, errno=%d(%s)\n", getpid(),args[0],errno,strerror(errno)); _exit(1); } else if (pid < 0) { fprintf(stderr,"pid %d: fork() returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } else { fprintf(stderr,"parent pid %d, child pid: %d: fork!\n",getpid(),pid); } pid = vfork(); if(pid == 0) { args[0] = "/bin/pwd"; args[1] = NULL; close(1); close(2); execv(args[0], args); fprintf(stderr,"pid %d: execve(%s) returned error, errno=%d(%s)\n", getpid(),args[0],errno,strerror(errno)); _exit(1); } else if (pid < 0) { fprintf(stderr,"pid %d: vfork() returned error, errno=%d(%s)\n", getpid(),errno,strerror(errno)); exit(1); } } /* Make sure everything is cleaned up and deleted before returning */ cleanup(); } /* create_load() */ void cleanup() { close(fd1); unlink(file1); unlink(file2); unlink(symlink1); unlink(dir1); return; }