您好,欢迎访问三七文档
文件描述符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结构体返回值:成功:新分配或指定的文件描述符出错:-1dup:复制已打开的文件描述字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参数whenceSEEK_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-tcx1wh5i节点包含文件的元数据除了文件名和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(如果是特殊文件
本文标题:操作系统实验8
链接地址:https://www.777doc.com/doc-3352915 .html