操作系统实验8

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

文件描述符open和close系统调用read和write系统调用(在C中是fread和fwrite)lseek系统调用(在C中是fseek)访问和显示文件元数据目录文件系统调用文件描述符特殊文件描述符:进程开始运行时自动打开的三个文件(文件描述符表前三项)0:STDIN_FILENO标准输入1:STDOUT_FILENO标准输出2:STDERR_FILENO标准错误输出文件描述符的应用打开文件,得到文件的文件描述符通过文件描述符对文件进行读写等操作通过文件描述符关闭文件POSIX表示可移植操作系统接口,最初开发POSIX标准,是为了提高UNIX环境下应用程序的可移植性。文件描述符的优点:兼容POSIX标准,许多Linux和UNIX系统调用都依赖于它。文件描述符的缺点:不能移植到UNIX以外的系统上去,也不直观。必须通过文件描述符对文件进行操作,是FILE结构类型的一个成员。文件描述符用户进程A连续三次打开文件fd1=open(“/etc/passwd”,O_RDONLY);//只读fd2=open(“local”,O_RDWR);//读写fd3=open(“/etc/passwd”,O_WRONLY);//只写得到三个文件描述符:fd1:3;fd2:4;fd3:5一个文件可以被某个进程多次打开,得到一个文件标识号。它们的file中的f_inode都指向同一个inode。open和close系统调用intopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);pathname:要打开的文件名flags:打开文件方式mode:文件的存取权限标志(flags)含义O_RDONLY只读O_WRONLY只写O_RDWR读写O_APPEND追加O_CREAT创建一个文件O_TRUNC如果文件已经存在,则删除文件的内容……open(pathname,O_CREAT|O_WRONLY|O_TRUNC,mode)等同creat()返回值:成功返回最小可用的文件描述符,否则返回-1modeS_IRWXUS_IXUSRS_IWUSRS_IRUSRS_IRGRPS_IROTH用户可以读用户可以写用户可以读、写、执行组可以读其他人可以读用户可以执行标志含义……可以用5个数字来表示文件的各种权限:要创建一个用户可读、可写、可执行,但是组没有权限,其他人可以读、可以执行的文件,并设置用户ID位。1(设置用户ID)、0(不设置组ID)、7(1+2+4,读、写、执行)、0(没有权限)、5(1+4,读、执行)----10705open(test,O_CREAT,S_IRWXU|S_IROTH|S_IXOTH|S_ISUID);open(test,O_CREAT,10705);close系统调用fd:要关闭的文件描述符返回值:成功返回0,失败返回-1关闭文件时,内核作相应处理对文件在系统打开文件表中的引用计数减1,如果减为0,则释放该文件描述项,使其为空闲可用项。对文件inode索引节点中的引用计数减1。释放该文件的文件描述符当一个进程终止时,内核会自动检查并回收该进程所有的文件描述符,用户不必显式地调用close。intclose(intfd);read和write系统调用intread(intfd,constvoid*buf,size_tlength)intwrite(intfd,constvoid*buf,size_tlength)buf:指向缓冲区的指针length:缓冲区的大小(以字节为单位)。返回值:成功:实际读写的字节数。失败:返回-1。read:从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中。write:把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。出错信息的处理全局变量errno:当LinuxCAPI函数发生异常时,会将errno变量赋一个整数值不同的值表示不同的含义,通过查看该值推测出错的原因。#includestdio.h#includestring.h#includeerrno.hintmain(void){intfd;externinterrno;if((fd=open(no/such/file,0))0){printf(errno=%d\n,errno);char*mesg=strerror(errno);printf(Mesg:%s\n,mesg);}}stdout--标准输出设备stderr--标准错误输出设备两者默认向屏幕输出。error.c[1]从键盘输入串,写到文件中。intmain(intargc,char**argv){intfd;charbuffer[BUFFER_SIZE];if(argc!=2){fprintf(stderr,Usage:%soutfilename\n\a,argv[0]);exit(1);}if((fd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR))==-1){fprintf(stderr,Open%sError:%s\n\a,argv[1],strerror(errno));exit(1);}printf(Now,pleaseinputstring);printf((ToquituseCTRL+D)\n);while(1){fgets(buffer,BUFFER_SIZE,stdin);if(feof(stdin))break;write(fd,buffer,strlen(buffer));}close(fd);}argv[0]:输入的程序名argv[1]:输入的程序名dup和dup2函数功能:复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体返回值:成功:新分配或指定的文件描述符出错:-1dup:复制已打开的文件描述字dup2:按指定条件复制文件描述字intdup(intoldfd);intdup2(intoldfd,intnewfd);newfd=dup(oldfd);newfd:系统分配的,未使用的最小描述符dup2(oldfd,newfd);newfd:自己指定结果:newfd指向oldfd[1_1]从键盘输入串,写到文件中。intmain(intargc,char**argv){intfd;charbuffer[BUFFER_SIZE];if(argc!=2){fprintf(stderr,Usage:%soutfilename\n\a,argv[0]);exit(1);}if((fd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR))==-1){fprintf(stderr,Open%sError:%s\n\a,argv[1],strerror(errno));exit(1);}if(dup2(fd,STDOUT_FILENO)==-1){fprintf(stderr,RedirectStandardOutError:%s\n\a,strerror(errno));exit(1);}fprintf(stderr,Now,pleaseinputstring);fprintf(stderr,(ToquituseCTRL+D)\n);while(1){fgets(buffer,BUFFER_SIZE,stdin);if(feof(stdin))break;write(STDOUT_FILENO,buffer,strlen(buffer));}close(fd);}intdup2(intoldfd,intnewfd);newfd指向oldfdintmain(){intfdw,fdr,len;charstr[Length];fdr=open(“source.txt”,O_RDONLY);//只读if(fdr)len=read(fdr,str,Length);else{printf(readfileerror);exit(0);}fdw=open(“target.txt”,O_CREAT|O_RDWR);//读/写write(fdw,str,len);close(fdr);close(fdw);}[li2]简单的文件拷贝。源文件是只有一个字符串构成的文本文件。lseek系统调用intlseek(intfd,offset_toffset,intwhence);lseek(fd,0,SEEK_END);返回值:文件的长度。功能:将文件读写指针相对whence移动offset个字节,实现随机存取返回值成功:文件指针相对于文件头的位置。出错:-1参数whenceSEEK_SET:相对文件开头SEEK_CUR:相对文件读写指针的当前位置SEEK_END:相对文件末尾文件偏移量(文件读写指针)标识下一次读或者写文件的位置保存在文件表中的文件描述表项中一个进程两次打开同一个文件,由于得到两个不同的文件描述符和文件描述项,分别拥有独立的文件偏移量(读写指针)lseek系统调用--文件偏移量intmain(void){charbuf1[]={abcdefghijk};charbuf2[]={1234567890};intfd;intlength;if((fd=open(test,NEWFILE,0600))==-1){printf(ERROR,openwritefileerror:%s\n,strerror(errno));exit(255);}length=strlen(buf1);if(write(fd,buf1,length)!=length){printf(ERROR,writefilefailed:%s\n,strerror(errno));exit(255);}if(lseek(fd,80,SEEK_SET)==-1){printf(ERROR,lseekfailed:%s\n,strerror(errno));exit(255);}length=strlen(buf2);if(write(fd,buf2,length)!=length){printf(ERROR,writefilefailed:%s\n,strerror(errno));exit(255);}close(fd);return0;}[li3]文件的定位操作用od命令查看文件的实际内容$od-tctestod(octaldump)功能:读取指定的文件的内容,并将其内容以八进制字码呈现出来。说明用户通常使用od命令查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。用od命令查看文件的实际内容$od-Ax-tcx1wh5i节点包含文件的元数据除了文件名和i节点所指向的文件数据外的所有信息使用stat、fstat、lstat系统调用和ls–l命令访问#includesys/stat.hintstat(constchar*path,structstat*buf);intfstat(intfd,structstat*buf);功能通过路径或文件描述符得到文件信息返回值:成功返回0,否则返回-1参数path:文件路径buf:返回的文件信息(structstat)structstat{dev_tst_dev;//文件所在的设备IDino_tst_ino;//i节点号mode_tst_mode;//文件对应的模式,文件,目录等nlink_tst_nlink;//硬链接个数uid_tst_uid;//uidgid_tst_gid;//giddev_tst_rdev;//设备文件ID(如果是特殊文件

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功