实验三普通文件和目录编程1.编写程序mycp.c,实现从命令行读入文件的复制功能,用原始文件系统调用。
实验流程图:实验程序代码://mycp.c#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#define bufsize 5int main(int argc,char * argv[]){int fd1,fd2;int i;char buf[bufsize];if(argc!=3){printf("argument error\n");exit(1);}fd1=open(argv[1],O_RDONLY);if(fd1==-1){printf("file %s can not opened\n",argv[1]);exit(1);}fd2=open(argv[2],O_RDWR|O_CREAT);if(fd2==-1){printf("Can not open file %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);return 0;}Linux环境下运行情况如下:road@ubuntu:~/桌面/work$ gcc -o cp cp.croad@ubuntu:~/桌面/work$ ./cpargument errorPlease use:cp file1 file2road@ubuntu:~/桌面/work$ ./cp a b其中,a为一文件,b为空文件。
2.编写程序mycat.c,实现文件内容的显示,用原始文件系统调用实现。
//mycat.c#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int main(int argc,char* argv[]){int fd;char buffer[100];int num;if(argc!=2){printf("usage : %s filename\n",argv[0]);return 1;}if((fd=open(argv[1],O_RDONLY))==-1){perror("cannot open the file");return 1;}while((num=read(fd,buffer,99))>0){buffer[num]='\0';printf("%s",buffer);}close(fd);return 0;}Linux环境下运行情况如下:road@ubuntu:~/桌面/work$ gcc -o mycat mycat.c road@ubuntu:~/桌面/work$ ./mycatusage : ./mycat filenameroad@ubuntu:~/桌面/work$ ./mycat aiamroadroad@ubuntu:~/桌面/work$其中,a为一个文件名。
3.1用流文件系统函数重新编写上面的程序。
实验流程图:不为3,提示用流文件写的文件复制功能函数://fcp.c#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main(int argc,char * argv[]){FILE *fd1,*fd2;char buffer[20];if(argc!=3){printf("argument error\n");printf("usage : %s filename1 filename2\n",argv[0]);return 1;}fd1=fopen(argv[1],"r");if(fd1==NULL){printf("file %s can not opened\n",argv[1]);return 1;}fd2=fopen(argv[2],"w");if(fd2==-1){printf("Can not open file %s\n",argv[2]);return 1;}while(!feof(fd1)){fread(&buffer,sizeof(char),1,fd1);fwrite(&buffer,sizeof(char),1,fd2);}fclose(fd1);fclose(fd2);return 0;}运行情况如下:road@ubuntu:~/桌面/work$ gcc -o fcp fcp.cfcp.c: In function ‘main’:fcp.c:25: warning: comparison between pointer and integer road@ubuntu:~/桌面/work$ ./fcp a b3.2用流文件编写显示函数:流程图:源程序代码://myfcat.c#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main(int argc,char * argv[]){FILE *fd1;char buffer;if(argc!=2){printf("argument error\n");return 1;}fd1=fopen(argv[1],"r");if(fd1==NULL){printf("file %s can not opened\n",argv[1]);return 1;}while(!feof(fd1)){fscanf(fd1,"%c",&buffer);printf("%c",buffer);}fclose(fd1);return 0;}运行情况如下:road@ubuntu:~/桌面/work$ gcc -o myfcat myfcat.c road@ubuntu:~/桌面/work$ ./myfcat aiamroad程序把文件a的内容显示出来了:iamroad4.调用目录函数,编写程序myls.c,实现按下面格式显示当前目录文件列表:文件名文件大小文件创建时间注意研究文件创建时间的转换,注意研究asctime()函数和ctime()函数的用法。
流程图如下:程序代码如下://myls.c#include <sys/stat.h>#include <stddef.h>#include <stdio.h>#include <sys/types.h>#include <dirent.h>int main(void){DIR *dp;struct dirent *ep;struct stat dup;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't open the directory .\n");return 0;}运行结果:列出了当前目录的所有文件的名称、大小和创建时间road@ubuntu:~/桌面/work$ gcc -o myls myls.cmyls.c: In function ‘main’:myls.c:18: warning: format ‘%u’ expects type ‘unsigned int’, but argument 2 has type ‘__off_t’myls.c:19: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’road@ubuntu:~/桌面/work$ ./mylsserver2.c~947 Sat Jan 9 17:25:42 2010pipol.c324 Fri Jan 8 22:47:21 2010newls.c498 Fri Jan 8 22:47:21 2010getip.c~635 Fri Jan 8 22:38:40 2010network1.c1552 Sat Jan 9 15:28:09 2010server28493 Sat Jan 9 17:19:13 2010程序打印出了当前目录所有文件的名称、文件大小和创建时间。
实验四进程实验1.编写程序,显示所有环境变量的名称和值。
程序源代码://environ.c#include<stdio.h>#include<unistd.h>#include<stdlib.h>int main(){char **ch;extern char**environ;ch=environ;while(*ch){printf("%s\n",*ch);ch++;}return 0;}2.*编写程序,模仿讲义上的mysystem程序,实现输入命令的执行。
流程图:程序源代码://mysystem.c#include <stddef.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>#define SHELL "/bin/sh"int mysystem(const char* command){int status;pid_t pid;pid=fork();if(pid==0){execl(SHELL,SHELL,"-c",command,NULL);_exit(EXIT_FAILURE);}else if(pid<0)status=-1;elseif(waitpid(pid,&status,0)!=pid)status=-1;return status;}int main(int argc,char * argv[]){mysystem(argv[1]);}运行结果:其中用了Shell中的ls命令,列出了当前目录的所有文件road@ubuntu:~/桌面/work$ gcc -o mysystem mysystem.croad@ubuntu:~/桌面/work./mysystem lsa fifo_channel4 mycat.c~ myls.c~ netsever.c read.ca~ fmycat.c myfcat my_sg_get netsever.c~ serverb getip.c myfcat.c my_sg_get.c network server2b~ getip.c~ myfcat.c~ my_sg_get.c~ network1 server2.cclose.c ipop.c myfifo.c mysystem network1.c server2.c~cp kill.c~ mykill mysystem.c network1.c~ server.ccp.c ls.c mykill.c mysystem.c~ network.c server.c~cp.c~ my mykill.c~ netclt network.c~ showev.cfcp my.c mylist.c netclt.c newls.c tcp k.txtfcp.c mycat myls netclt.c~ open.c tcp.txtfcp.c~ mycat.c myls.c netsever pipol.c write.croad@ubuntu:~/桌面/work$实验五命名管道实验1.研究mkfifo命令,在当前目录下创建一个myfifo的命名管道。