《Linux程序设计 第四版》之第三章的练习题
1、P103
一个目录扫描程序。
#include<stdio.h> #include<dirent.h> #include<sys/stat.h> int isAdir(char* path); //判断路径是否是目录类型 void printdirs(char* path,int depth) //递归遍历打印文件与目录名 { DIR* dir=opendir(path); struct dirent* dirents; chdir(path); while(dirents=readdir(dir)) { if(isAdir(dirents->d_name)) { if(strcmp(".",dirents->d_name)==0||strcmp("..",dirents->d_name)==0) continue; printf("%*s%s/ \n",depth," ",dirents->d_name); printdirs(dirents->d_name,depth+1); } else printf("%*s%s/ \n",depth," ",dirents->d_name); } chdir(".."); closedir(dir); } int isAdir(char* path) { struct stat statbuff; //printf("%s",path); lstat(path,&statbuff); if(S_ISDIR(statbuff.st_mode)) { return 1; } return 0; } int main(int argc,char* argv[]) { /* char* path[1023]; gets(path); //用户在程序中自己输入的Path chdir(path);*/ char* path="."; //用程序的参数当path if(argc >=2) { path = argv[1]; } if(isAdir(path)==1) { printdirs(path,0); perror("wrong::"); return 1; } printf("path is not a dir"); return 1; }
2、P112
使用mmap函数程序,来修改文件内容,将文件映射到内存,并且看成数组进行更改!
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<sys/mman.h> #define recordNum (50) struct Record //记录的结构 { int integ; char string[15]; }Record; int creatfile(char* file) { struct Record r; FILE* fp=fopen(file,"w+"); int i=0; for(;i<50;i++) { r.integ=i; memset(r.string,0,15); sprintf(r.string,"Record-%d",i); //格式化字符串输入到r.string中 fwrite(&r,sizeof( r),1,fp); } fclose(fp); } void memomap(char* file) { struct Record rECORD,*r; int f=open(file,O_RDWR); r=(struct Record *)mmap( 0 , recordNum*sizeof(struct Record), PROT_READ|PROT_WRITE, MAP_SHARED , f,0); //内存映射函数 r[20].integ=100; sprintf(r[20].string,"Record-%d",r[20].integ); msync((void*)r,recordNum*sizeof(rECORD),MS_SYNC); //将该内存段的修改保存回文件中 munmap((void*)r,recordNum*sizeof(rECORD)); //释放内存段 close(f); return; } int main(int argc,char* argv[]) { creatfile("records.date"); memomap("records.date"); return 1; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。