From 9ebe0dd9859f23692df4ba87c3e8fbcd151e1506 Mon Sep 17 00:00:00 2001 From: Rahul C S Date: Mon, 19 Mar 2012 16:47:24 +0530 Subject: Improve create.c program. *Adding check so that program does not crash if getcwd fails. *Defining macro so as to remove code duplication. Change-Id: Ia884b3fa018d4dfeec56c6f20de413703c74fad7 Signed-off-by: Rahul C S --- c_pgms/create.c | 132 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 59 deletions(-) (limited to 'c_pgms') diff --git a/c_pgms/create.c b/c_pgms/create.c index e377a92..ea08e8a 100644 --- a/c_pgms/create.c +++ b/c_pgms/create.c @@ -10,6 +10,21 @@ #include #include +#define do_file_ops(type) { \ + mkdir (dirname_##type,0755); \ + strcat(entries_dir_path,dirname_##type); \ + create_##type(dirname_##type,num); \ + rmdir(dirname_##type); \ +} + +#define chk_working_dir(path) { \ + if(NULL == path) { \ + fprintf(stderr, "getcwd failed (%s)\n", strerror(errno)); \ + return 255; \ + } \ +} + + double timeval_elapsed(struct timeval *tv1, struct timeval *tv2); double timeval_elapsed(struct timeval *tv1, struct timeval *tv2) @@ -18,7 +33,8 @@ double timeval_elapsed(struct timeval *tv1, struct timeval *tv2) (tv2->tv_usec - tv1->tv_usec) * 1.0e-6; } -/* This function sets the limit on maximum number of open files. By default it is set to 1024.This function raises that limit*/ +/* This function sets the limit on maximum number of open files. + By default it is set to 1024.This function raises that limit*/ int ulimit_unlimited() { @@ -51,12 +67,14 @@ int create_block_special_file(char *dir, int n) char name[4096]; char remove_name[4096]; int i; - + gettimeofday(&before,NULL); - + for ( i = 0; i < n; i++ ) { sprintf(name,"%s/%s.%d", dir, "dev", i); - dev = makedev(2,2 ); /* creates a device with given major and minor numbers and returns a structure of type dev_t */ + dev = makedev(2,2); + /* creates a device with given major and minor numbers + and returns a structure of type dev_t */ mknod_ret = mknod(name,S_IFBLK|0644,dev); if(mknod_ret) { @@ -64,14 +82,14 @@ int create_block_special_file(char *dir, int n) fprintf(stderr,"%s:Creating device file %s failed\n", strerror(errno),name); exit(err); - } + } } - + gettimeofday(&after,NULL); - + create = timeval_elapsed(&before,&after) * 1e6 / n; printf("Time to create block device special file is %.01f us\n",create); - + for ( i = 0; i < n; i++ ) { sprintf(remove_name,"%s/%s.%d", dir, "dev", i); unlink(remove_name); @@ -79,7 +97,7 @@ int create_block_special_file(char *dir, int n) return 0; } - + int create_directory(char *dirname, int n) { @@ -90,9 +108,9 @@ int create_directory(char *dirname, int n) int err; int i; struct timeval before, after; - + gettimeofday(&before,NULL); - + for ( i = 1; i < n; i++ ) { sprintf(name,"%s/%s.%d", dirname, "dir", i); makedir_ret = mkdir(name,0755); @@ -102,24 +120,24 @@ int create_directory(char *dirname, int n) strerror(errno),name); exit(err); } - + } - + gettimeofday(&after,NULL); create = timeval_elapsed(&before,&after) * 1e6 / n; printf("Time to create directory is %.01f us\n",create); - + for ( i = 0; i < n; i++) { sprintf(rmdir_name,"%s/%s.%d", dirname, "dir", i); rmdir(rmdir_name); } - + return 0; } -int create_character_special_file(char *dir, int n) +int create_char_special_file(char *dir, int n) { int mknod_ret; int err; @@ -129,12 +147,14 @@ int create_character_special_file(char *dir, int n) char name[4096]; char remove_name[4096]; int i; - + gettimeofday(&before,NULL); - + for ( i = 0; i < n; i++ ) { sprintf(name,"%s/%s.%d", dir, "chr", i); - dev = makedev(2,2); /* creates a device with given major and minor numbers and returns a structure of type dev_t */ + dev = makedev(2,2); + /* creates a device with given major and minor numbers + and returns a structure of type dev_t */ mknod_ret = mknod(name,S_IFCHR|0644,dev); if(mknod_ret) { @@ -142,20 +162,20 @@ int create_character_special_file(char *dir, int n) fprintf(stderr,"%s:Creating device file %s failed\n", strerror(errno),name); exit(err); - } - + } + } - + gettimeofday(&after,NULL); - + create = timeval_elapsed(&before,&after) * 1e6 / n; printf("Time to create character special file is %.01f us\n",create); - + for ( i = 0; i < n; i++ ) { sprintf(remove_name,"%s/%s.%d", dir, "chr", i); unlink(remove_name); } - + return 0; } @@ -169,9 +189,9 @@ int create_pipe(char *dirname, int n) double create_pipe; int i; int ret; - + gettimeofday(&before,NULL); - + for ( i = 0; i < n ; i++) { sprintf(pipe_name,"%s/%s.%d", dirname, "pipe", i); ret = mkfifo(pipe_name, 0644); @@ -184,15 +204,15 @@ int create_pipe(char *dirname, int n) } gettimeofday(&after,NULL); - + create_pipe = timeval_elapsed(&before,&after) * 1e6 / n; printf("Time to create a pipe is %.01f us\n", create_pipe); - + for ( i = 0; i < n; i++) { sprintf(pipe_name,"%s/%s.%d", dirname, "pipe", i); unlink(pipe_name); } - + return 0; } @@ -205,9 +225,9 @@ int create_regular_file(char *dirname, int n) double create_file; int i; int ret; - + gettimeofday(&before,NULL); - + for ( i = 0; i < n ; i++) { sprintf(file_name,"%s/%s.%d", dirname, "file", i); ret = open(file_name, O_CREAT|O_RDWR,0600); @@ -218,17 +238,17 @@ int create_regular_file(char *dirname, int n) exit(err); } } - + gettimeofday(&after,NULL); - + create_file = timeval_elapsed(&before,&after) * 1e6 / n; printf("Time to create a regular file is %.01f us\n", create_file); - + for ( i = 0; i < n; i++) { sprintf(file_name,"%s/%s.%d", dirname, "file", i); unlink(file_name); } - + return 0; } @@ -239,52 +259,46 @@ int main(int argc, char **argv) int err; int num = 1000; char *dir = "."; - char *dirname = "block_dir"; - char *dirname_char = "char_dir"; + char *dirname_block_special_file = "block_dir"; + char *dirname_char_special_file = "char_dir"; char *dirname_pipe = "pipe_dir"; char *dirname_regular_file = "file_dir"; - char *entries_dir_path; + char *entries_dir_path = NULL; if(argv[1]) num = atoi(argv[1]); - + printf("%d\n",num); if ( ulimit_unlimited() == -1 ) { fprintf(stderr, "%s:ulimit failed going with default value, Setting %d to 1000\n", strerror(errno),num); num = 1000; } - /* Creating 1000 block special files and calculating the time needed for it */ + /* Creating 1000 block special files and + calculating the time needed for it */ entries_dir_path = getcwd(entries_dir_path,255); - mkdir (dirname,0755); - strcat(entries_dir_path,dirname); - create_block_special_file(dirname,num); - rmdir(dirname); + chk_working_dir(entries_dir_path); + do_file_ops(block_special_file); - /* Creating 1000 cgaracter special files and calculating the time needed for it */ + /* Creating 1000 character special files and + calculating the time needed for it */ entries_dir_path = getcwd(entries_dir_path,255); - mkdir (dirname_char,0755); - strcat(entries_dir_path,dirname_char); - create_character_special_file(dirname_char,num); - rmdir(dirname_char); + chk_working_dir(entries_dir_path); + do_file_ops(char_special_file); /*Creating 1000 directories and calculating the time needed for it */ create_directory(dir,num); /* Creating 1000 files and calculating the time needed for it */ entries_dir_path = getcwd(entries_dir_path,255); - mkdir (dirname_pipe,0755); - strcat(entries_dir_path,dirname_pipe); - create_pipe(dirname_pipe,num); - rmdir(dirname_pipe); + chk_working_dir(entries_dir_path); + do_file_ops(pipe); /* Creating 1000 regular files and calculating the time needed for it */ entries_dir_path = getcwd(entries_dir_path,255); - mkdir (dirname_regular_file,0755); - strcat(entries_dir_path,dirname_regular_file); - create_regular_file(dirname_regular_file,num); - rmdir(dirname_regular_file); - + chk_working_dir(entries_dir_path); + do_file_ops(regular_file); + return 0; } -- cgit