实验三普通文件和目录编程1.编写程序mycp.c,实现从命令行读入文件的复制功能,用原始文件系统调用。实验流程图:判断输入main函数参数个数argcargc!=3noExit(0)fd1=Open(argv[1],O_RDONLY);fd2=open(argv[2],O_RDWR|O_CREAT);1read(fd1,buf,bufsize);write(fd2,buf,i);if(i!=bufsize)break;实验程序代码://mycp.c#includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.h#definebufsize5intmain(intargc,char*argv[]){intfd1,fd2;inti;charbuf[bufsize];if(argc!=3){printf(argumenterror\n);exit(1);}fd1=open(argv[1],O_RDONLY);if(fd1==-1){printf(file%scannotopened\n,argv[1]);exit(1);}fd2=open(argv[2],O_RDWR|O_CREAT);if(fd2==-1){printf(Cannotopenfile%s\n,argv[2]);exit(1);}while(1){i=read(fd1,buf,bufsize);write(fd2,buf,i);if(i!=bufsize)break;}close(fd1);close(fd2);return0;}Linux环境下运行情况如下:road@ubuntu:~/桌面/work$gcc-ocpcp.croad@ubuntu:~/桌面/work$./cpargumenterrorPleaseuse:cpfile1file2road@ubuntu:~/桌面/work$./cpab其中,a为一文件,b为空文件。2.编写程序mycat.c,实现文件内容的显示,用原始文件系统调用实现。实验流程图:No重新输入命令行不等于1报错通过main函数从键盘输入命令行Argc=2?fd=open(argv[1],O_RDONLY)while((num=read(fd,buffer,99))0)实验源代码如下://mycat.c#includestdio.h#includeunistd.h#includesys/types.h#includesys/stat.h#includefcntl.hintmain(intargc,char*argv[]){intfd;charbuffer[100];intnum;if(argc!=2){printf(usage:%sfilename\n,argv[0]);return1;}if((fd=open(argv[1],O_RDONLY))==-1){perror(cannotopenthefile);return1;}while((num=read(fd,buffer,99))0){buffer[num]='\0';printf(%s,buffer);}close(fd);return0;}Linux环境下运行情况如下:road@ubuntu:~/桌面/work$gcc-omycatmycat.croad@ubuntu:~/桌面/work$./mycatbuffer[num]='\0';printf(%s,buffer);usage:./mycatfilenameroad@ubuntu:~/桌面/work$./mycataiamroad!!!road@ubuntu:~/桌面/work$其中,a为一个文件名。3.1用流文件系统函数重新编写上面的程序。实验流程图:不为3,提示用main命令输入命令行:fcpfilename1filename2argc!=3fd1=fopen(argv[1],r);打开第一个文件读出数据fd2=fopen(argv[2],w);打开第二个文件写入数据fread(&buffer,sizeof(char),1,fd1);fwrite(&buffer,sizeof(char),1,fd2);把第一个文件写入第二个文件关闭两个文件描述符用流文件写的文件复制功能函数://fcp.c#includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.hintmain(intargc,char*argv[]){FILE*fd1,*fd2;charbuffer[20];if(argc!=3){printf(argumenterror\n);printf(usage:%sfilename1filename2\n,argv[0]);return1;}fd1=fopen(argv[1],r);if(fd1==NULL){printf(file%scannotopened\n,argv[1]);return1;}fd2=fopen(argv[2],w);if(fd2==-1){printf(Cannotopenfile%s\n,argv[2]);return1;}while(!feof(fd1)){fread(&buffer,sizeof(char),1,fd1);fwrite(&buffer,sizeof(char),1,fd2);}fclose(fd1);fclose(fd2);return0;}运行情况如下:road@ubuntu:~/桌面/work$gcc-ofcpfcp.cfcp.c:Infunction‘main’:fcp.c:25:warning:comparisonbetweenpointerandintegerroad@ubuntu:~/桌面/work$./fcpab3.2用流文件编写显示函数:流程图:NO重新输入Yes不满足条件用main函数键入命令行:myfcatfilenameargc=2?fd1=fopen(argv[1],r);打开文件以备读入数据while(!feof(fd1))fscanf(fd1,%c,&buffer);printf(%c,buffer);显示文件内容关闭文件并退出源程序代码://myfcat.c#includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.hintmain(intargc,char*argv[]){FILE*fd1;charbuffer;if(argc!=2){printf(argumenterror\n);return1;}fd1=fopen(argv[1],r);if(fd1==NULL){printf(file%scannotopened\n,argv[1]);return1;}while(!feof(fd1)){fscanf(fd1,%c,&buffer);printf(%c,buffer);}fclose(fd1);return0;}运行情况如下:road@ubuntu:~/桌面/work$gcc-omyfcatmyfcat.croad@ubuntu:~/桌面/work$./myfcataiamroad!!!程序把文件a的内容显示出来了:iamroad!!!4.调用目录函数,编写程序myls.c,实现按下面格式显示当前目录文件列表:文件名文件大小文件创建时间注意研究文件创建时间的转换,注意研究asctime()函数和ctime()函数的用法。流程图如下:dp!=NULL继续程序代码如下://myls.c#includesys/stat.h#includestddef.h用main函数输入命令行:mylsdp=opendir(./);打开当前目录while(ep=readdir(dp))读出当前目录的文件stat(ep-d_name,&dup);获得详细信息puts(ep-d_name);stat(ep-d_name,&dup);printf(%u,dup.st_size);printf(%s,ctime(&dup.st_atime));打印出文件名、文件大小、创建时间#includestdio.h#includesys/types.h#includedirent.hintmain(void){DIR*dp;structdirent*ep;structstatdup;dp=opendir(./);if(dp!=NULL){while(ep=readdir(dp)){puts(ep-d_name);stat(ep-d_name,&dup);printf(%u,dup.st_size);printf(%s,ctime(&dup.st_atime));}closedir(dp);}elseputs(Couldn'topenthedirectory.\n);return0;}运行结果:列出了当前目录的所有文件的名称、大小和创建时间road@ubuntu:~/桌面/work$gcc-omylsmyls.cmyls.c:Infunction‘main’:myls.c:18:warning:format‘%u’expectstype‘unsignedint’,butargument2hastype‘__off_t’myls.c:19:warning:format‘%s’expectstype‘char*’,butargument2hastype‘int’road@ubuntu:~/桌面/work$./mylsserver2.c~947SatJan917:25:422010pipol.c324FriJan822:47:212010newls.c498FriJan822:47:212010getip.c~635FriJan822:38:402010network1.c1552SatJan915:28:092010server28493SatJan917:19:132010程序打印出了当前目录所有文件的名称、文件大小和创建时间。实验四进程实验1.编写程序,显示所有环境变量的名称和值。程序源代码://environ.c#includestdio.h#includeunistd.h#includestdlib.hintmain(){char**ch;externchar**environ;ch=environ;while(*ch){printf(%s\n,*ch);ch++;}return0;}2.*编写程序,模仿讲义上的mysystem程序,实现输入命令的执行。流程图:用main函数输入命令行:mysystemshellpid=fork();创建进程execl(SHELL,SHELL,-c,command,NULL);用Shell命令替换父进程waitpid(pid,&status,0)子进程等待程序源代码://mysystem.c#includestddef.h#includestdlib.h#includeunistd.h#includesys/types.h#includesys/wait.h#defineSHELL/bin/shintmysystem(constchar*command){intstatus;pid_tpid;pid=fork();if(pid==0){execl(SHELL,SHELL,-c,command,NULL);_exit(EXIT_FAILURE);}elseif(pid0)status=-1;elseif(waitpid(pid,&status,0)!=pid)status=-1;returnstatus;}intmain(intargc,char*argv[]){mysystem(