logo资料库

北邮 蒋砚军 unix实验报告(1).pdf

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
实 验 报 告 学 院: 计算机学院 课程名称: UNIX 编程环境 实验名称: 第一次上机练习(Vi) 班 级: 2009211311 姓 名: horizon 学 号:
Unix 编程环境 计算机学院网络工程 11 班 horizon 第一次上机练习 第一次上机实验 一.实验目的: 练习 vi,使用 UNIX 的系统调用和库函数,体会 UNIX 文件通配符的处理方 式以及命令对选项的处理方式。 二.实验目标: 编程实现程序 list.c,列表普通磁盘文件(不考虑目录和设备文件等),列 出文件名和文件大小。 (1)与 ls 命令类似,命令行参数可以有 0 到多个 0 个参数:列出当前目录下所有文件 参数为普通文件:列出文件 参数为目录:列出目录下所有文件 (2)实现自定义选项 r,a,l,h,m 以及-- r 递归方式列出子目录 a 列出文件名第一个字符为圆点的普通文件(默认情况下不列出 文件名首字符为圆点的文件) l 后跟一整数,限定文件大小的最小值(字节) h 后跟一整数,限定文件大小的最大值(字节) m 后跟一整数 n,限定文件的最近修改时间必须在 n 天内 -- 显式地终止命令选项分析 三.实验源码: #include #include #include #include #include #include int sav(char ch[],int l[])/*将 char[]转换为数字*/ { int i=0; l[0]=0; while(ch[i]!='\0') if(ch[i]<='9'&&ch[i]>='0') { l[0]=10*l[0]+ch[i]-'0'; i++; } else return 0; return 1; } /*********************主函数********************/ main(int argc, char *argv[]) { int i,j,k,ret,l=-1,h=-1,m=-1; 2
Unix 编程环境 计算机学院网络工程 11 班 horizon 第一次上机练习 char path[30],path1[30]; struct stat st; DIR *dir; /*定义 Dir*/ struct dirent * entry; /*定义 Dirent entry*/ int order[7]; /*各个数字代表含义 order[1]->r; [2]->a; [3]->l; [4]->h; [5]->m; [6]->--*/ time_t tp; /*当前时间*/ /*得到当前 path*/ for(i = 1; i < argc; i++); i--; if(argv[i][0]=='/' && argc!=1) { for(j = 0; argv[i][j] != '\0'; j++) path[j] = argv[i][j]; path[j]='\0'; } else { path[0]='.'; path[1]='\0'; } /*Get Order*/ for(i=1;i<=6;i++) order[i]=0; for(i = 1; i < argc; i++) { if(argv[i][0]=='-') { if(argv[i][1]=='r') order[1]=1; else if(argv[i][1]=='a') order[2]=1; else if(argv[i][1]=='l') { order[3]=1; i++; if(i
Unix 编程环境 计算机学院网络工程 11 班 horizon 第一次上机练习 } } else if(argv[i][1]=='h') { order[4]=1; i++; if(i
Unix 编程环境 计算机学院网络工程 11 班 horizon 第一次上机练习 } if(order[4]==1 && h==-1) { printf("Wrong order!\n"); return; } if(order[5]==1 && m==-1) { printf("Wrong order!\n"); return; } time(&tp);/*获取当前时间*/ ret = stat(path, &st);/*获取信息*/ /*处理 order 的信息*/ if(ret == 0) /*成功读取 path 信息*/ { if(S_ISDIR(st.st_mode)) /*如果是 dir*/ { dir = opendir(path); if (dir == NULL) /*Unreadable*/ { printf("Open directory \"%s\": %s (ERROR %d)\n",path, strerror(errno), errno); return 1; } while ((entry = readdir(dir)) != NULL) /*一直读,直至文件结束*/ { strcpy(path1,path); strcat(path1, "/"); strcat(path1, entry->d_name); stat(path1, &st); if(order[1]==0) /*不是-r*/ { if(order[2]==1) /*-a*/ { if(order[3]==1 && order[4]==1) /*-l 和-h*/ { if((st.st_size<=h) && (st.st_size>=l)) if(order[5]==1){ /*-m*/ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", entry->d_name);} else /*no -m*/ printf("%s \n", entry->d_name); 5
Unix 编程环境 计算机学院网络工程 11 班 horizon 第一次上机练习 } else if(order[3]==1 && order[4]==0) { if(st.st_size>=l) if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", entry->d_name);} else printf("%s \n", entry ->d_name); } else if(order[3]==0 && order[4]==1) { if(st.st_size<=m) if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", entry->d_name);} else printf("%s \n", entry->d_name); } else if(order[3]==0 && order[4]==0) { if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", entry->d_name);} else printf("%s \n", entry->d_name); } } else { if(order[3]==1 && order[4]==1) { if((st.st_size<=h) && (st.st_size>=l) && entry->d_name[0]!='.') if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", entry->d_name);} else printf("%s \n", entry->d_name); } else if(order[3]==1 && order[4]==0) { if(st.st_size>=l && entry->d_name[0]!='.') if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) 6
Unix 编程环境 计算机学院网络工程 11 班 horizon 第一次上机练习 printf("%s \n", entry->d_name);} else printf("%s \n", entry->d_name); } else if(order[3]==0 && order[4]==1) { if(st.st_size<=m && entry->d_name[0]!='.') if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", entry->d_name);} else printf("%s \n", entry->d_name); } else if(order[3]==0 && order[4]==0) { if(entry->d_name[0]!='.') if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", entry->d_name);} else printf("%s \n", entry->d_name); } } }/*order[1]=0 end*/ }/*while*/ closedir(dir); }/*is DIR*/ else/*not a dir*/ { /*Change path into filename*/ for(i=0,j=0;path[i]!='\0';i++) if(path[i]=='/') j++; k=j; for(j=0,i=0;j-r*/ if(order[2]==1) 7
Unix 编程环境 计算机学院网络工程 11 班 horizon 第一次上机练习 { if(order[3]==1 && order[4]==1) { if((st.st_size<=h) && (st.st_size>=l)) if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", path);} else printf("%s \n", path); } else if(order[3]==1 && order[4]==0) { if(st.st_size>=l) if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", path);} else printf("%s \n", path); } else if(order[3]==0 && order[4]==1) { if(st.st_size<=m) if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", path);} else printf("%s \n", path); } else if(order[3]==0 && order[4]==0) { if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) printf("%s \n", path);} else printf("%s \n", path); } } else { if(order[3]==1 && order[4]==1) { if((st.st_size<=h) && (st.st_size>=l) && path[0]!='.') if(order[5]==1){ if(((tp-st.st_mtime)/86400+1)<=m) 8
分享到:
收藏