版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux系统调用和文件I/OLinux系统调用与文件I/OLinux系统调用所谓系统调用是指操作系统提供应用户程序的一组“特殊〞接口,用户程序可以经过这组“特殊〞接口来获得操作系统内核提供的特殊效力。在Linux中用户程序不能直接访问内核提供的效力。为了更好的维护内核空间,将程序的运转空间分为内核空间和用户空间,他们运转在不同的级别上,在逻辑上是相互隔离的。用户程序接口〔API〕在Linux中用户编程接口〔API〕遵照了在UNIX中最流行的运用编程界面规范—POSIX规范。这些系统调用编程接口主要经过C库〔libc〕实现的。内核空间用户空间系统调用用户程序接口API系统命令系统调用、API与系统命令之间的关系文件I/O引见可用的文件I/O函数——翻开文件、读文件、写文件等等。大多数Linux文件I/O只需用到5个函数:open、read、write、lseek以及close。不带缓存指的是每个read和write都调用内核中的一个系统调用。这些不带缓存的I/O函数不是ANSIC的组成部分,而是POSIX组成部分。文件描画符对于内核而言,一切翻开文件都由文件描画符援用。文件描画符是一个非负整数。当翻开一个现存文件或创建一个新文件时,内核向进程前往一个文件描画符。当读、写一个文件时,用open或creat前往的文件描画符标识该文件,将其作为参数传送给read或write。文件描画符在POSIX.1运用程序中,整数0、1、2应被代换成符号常数:STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO这些常数都定义在头文件<unistd.h>中。文件描画符的范围是0~OPEN_MAX。早期的UNIX版本采用的上限值是19(允许每个进程翻开20个文件),如今很多系统那么将其添加至256。open函数#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>intopen(constchar*pathname,intoflag, …/*,mode_tmode*/);功能:翻开文件前往:假设胜利为文件描画符,假设出错为-1open函数pathname是要翻开或创建的文件的名字。oflag参数可用来阐明此函数的多个选择项。对于open函数而言,仅当创建新文件时才运用第三个参数。用以下一个或多个常数进展或运算构成oflag参数(这些常数定义在<fcntl.h>头文件中):O_RDONLY只读翻开。O_WRONLY只写翻开。O_RDWR读、写翻开。O_APPEND每次写时都加到文件的尾端。O_CREAT假设此文件不存在那么创建它。运用此选择项时,需同时阐明第三个参数mode,用其阐明该新文件的存取答应权位。O_EXCL假好像时指定了O_CREAT,而文件曾经存在,那么出错。这可测试一个文件能否存在,假设不存在那么创建此文件成为一个原子操作。O_TRUNC假设此文件存在,而且为只读或只写胜利翻开,那么将其长度截短为0。O_NOCTTY假设pathname指的是终端设备,那么不将此设备分配作为此进程的控制终端。O_NONBLOCK假设pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,那么此选择项为此文件的本次翻开操作和后续的I/O操作设置非阻塞方式。O_SYNC使每次write都等到物理I/O操作完成。creat函数#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>intcreat(constchar*pathname,mode_tmode);功能:创建一个新的文件。前往:假设胜利为只写翻开的文件描画符,假设出错为-1。留意,此函数等效于:open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);creat的一个缺乏之处是它以只写方式翻开所创建的文件。close函数#include<unistd.h>intclose(intfiledes);功能:封锁一个翻开文件前往:假设胜利为0,假设出错为-1 当一个进程终止时,它一切的翻开文件都由内核自动封锁。很多程序都运用这一功能而不显式地用close封锁翻开的文件。lseek函数每个翻开文件都有一个与其相关联的“当前文件偏移量〞。它是一个非负整数,用以度量从文件开场处计算的字节数。通常,读、写操作都从当前文件偏移量处开场,并使偏移量添加所读或写的字节数。按系统默许,当翻开一个文件时,除非指定O_APPEND选择项,否那么该位移量被设置为0。可以调用lseek显式地定位一个翻开文件。lseek函数#include<sys/types.h>#include<unistd.h>off_tlseek(intfilesdes,off_toffset,intwhence);功能:设置文件内容读写位置前往:假设胜利为新的文件位移,假设出错为-1。对参数offset的解释与参数whence的值有关。假设whence是SEEK_SET,那么将该文件的位移量设置为距文件开场处offset个字节。假设whence是SEEK_CUR,那么将该文件的位移量设置为其当前值加offset,offset可为正或负。假设whence是SEEK_END,那么将该文件的位移量设置为文件长度加offset,offset可为正或负。read函数#include<unistd.h>ssize_tread(intfd,void*buf,size_tcount);功能:从翻开文件中读数据前往:读到的字节数,假设已到文件尾为0,假设出错为-1。read函数有多种情况可使实践读到的字节数少于要求读字节数:读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,假设在到达文件尾端之前还有30个字节,而要求读100个字节,那么read前往30,下一次再调用read时,它将前往0(文件尾端)。当从终端设备读时,通常以行为单位,读到换行符就前往。当从网络读时,网络中的缓冲机构能够呵斥前往值小于所要求读的字节数。某些面向记录的设备,例如磁带,一次最多前往一个记录。读操作从文件的当前位移量处开场,在胜利前往之前,该位移量添加实践读得的字节数。write函数#include<unistd.h>ssize_twrite(intfd,constvoid*buf,size_tcount);功能;向翻开文件写数据。前往:假设胜利为已写的字节数,假设出错为-1。其前往值通常与参数count的值不同,否那么表示出错。write出错的一个常见缘由是:磁盘已写满,或者超越了对一个给定进程的文件长度限制。对于普通文件,写操作从文件的当前位移量处开场。假设在翻开该文件时,指定了O_APPEND选择项,那么在每次写操作之前,将文件位移量设置在文件的当前结尾处。在一次胜利写之后,该文件位移量添加实践写的字节数。fcntl函数#include<unistd.h>#include<fcntl.h>intfcntl(intfiledes,intcmd,...);功能:改动曾经翻开文件的性质前往:假设胜利那么依赖于cmd(),假设出错为-1。fcntl函数fcntl函数有五种功能:复制一个现存的描画符,新文件描画符作为函数值返(cmd=F_DUPFD〕。获得/设置文件描画符标志,对应于filedes的文件描画符标志作为函数值前往.〔cmd=F_GETFD或F_SETFD〕。获得/设置文件形状标志,对应于filedes的文件形状标志作为函数值前往。〔cmd=F_GETFL或F_SETFL〕。获得/设置异步I/O〔cmd=F_GETOWN或F_SETOWN〕。获得/设置记录锁〔cmd=F_SETLK,F_SETLKW〕。O_RDONLY只读打开O_WRONLY只写打开O_RDWR读/写打开O_APPEND写时都添加至文件尾O_NONBLOCK非阻塞方式O_SYNC等待写完成O_ASYNC异步I/O文件形状标志阐明ioctl函数ioctl函数是I/O操作的杂物箱。不能用本章中其他函数表示的I/O操作通常都能用ioctl表示。终端I/O是ioctl的最大运用方面,主要用于设备的I/O控制。#include<sys/ioctl.h>intioctl(intfiledes,intrequest,...);前往:假设出错那么为-1,假设胜利那么为其他值。ioctl函数例如:串口线上传送的数据经过read、write来操作,而串口的波特率、校验位、停顿位可以经过ioctl来设置。规范文件I/O操作fopen函数#include<stdio.h>FILE*fopen(constchar*path,constchar*mode)函数功能:翻开一个文件前往值:文件顺利翻开后,指向该流的文件指针就会被前往。假设文件翻开失败那么前往NULL,并把错误代码存在error中。参数阐明path字符串包含欲翻开的文件途径及文件名,参数mode字符串那么代表着流形状。Mode有以下几种形状字符串:r翻开只读文件,该文件必需存在r+翻开可读写的文件,该文件必需存在w翻开只写文件,假设文件存在那么文件长度清为0,即该文件内容会消逝。假设文件不存在那么建立该文件。w+翻开可读写文件,假设文件存在那么文件长度清为0,即该文件内容会消逝。假设文件不存在那么建立该文件。a以附加的方式翻开只写文件。假设文件不存在那么建立,存在那么把数据添加在文件末尾a+以附加的方式翻开读写文件,同a。fclose函数#include<stdio.h>Intfclose(FILE*stream)功能:封锁一个流。留意:运用fclose函数就可以把缓冲区内最后剩下的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。fputc函数#include<stdio.h>intfputc(intch,FILE*stream);功能:送一个字符到一个流中。fgetc函数#include<stdio.h>intfgetc(FILE*stream);功能:fgetc()从参数stream所指的文件中读取一个字符。假设读到文件尾而无数据时便前往EOFfseek函数include<stdio.h>intfseek(FILE*stream,longoffset,intfromwhere);类似lseek();ftelllongftell(FILE*stream);fgets函数#inlcude<stdio.h>Char*fgets(char*s,intsize,FILE*stream);函数阐明:函数fgets用来从参数stream所指的文件内读入字符并存入到参数s所指的内存空间,直到出现换行符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串终了。前往值:胜利前往s指针,错误前往NULLfputs函数fprintf函数#include<stdio.h>intfprintf(FILE*stream,constchar*format,…);功能:fprintf()函数根据指定的format〔格式〕〔格式〕发送信息〔参数〕到由stream〔流〕指定的文件。fprintf()只能和printf()一样任务。Fprintf()的前往值是输出的字符数,发送错误时前往一个负值。fscanf函数#include<stdio.h>Intfscanf(FILE*stream,char*format,…);功能:从一个流中执行格式化输入fread函数#include<stdio.h>Intfread(void*ptr,intsize,intnitems,FILE*stream);功能:从一个流中读数据参数:用于接受数据的地址〔指针〕〔ptr〕单个元素的大小〔size〕:单位是字节而不是位,例如:读取一个整数值就是4元素个数〔nitems〕提供数据的文件指针〔stream〕前往值:胜利读取的元素个数fwrite函数#include<stdio.h>Intfwrite(constvo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年外研版八年级历史上册月考试卷含答案
- 2025年粤教新版九年级历史下册阶段测试试卷
- 2025年人教版选修6历史下册阶段测试试卷含答案
- 2025年湘教新版选修2地理上册月考试卷含答案
- 2025年粤教版九年级科学上册阶段测试试卷含答案
- 2025年冀教版九年级生物上册阶段测试试卷含答案
- 2025年沪教版八年级地理下册阶段测试试卷
- 2025年度跨境电商农产品进出口代理服务合同范本4篇
- 二零二五年度企业年会礼品赞助合作合同协议书4篇
- 二零二五年度南海区劳动就业服务中心农村劳动力转移就业合同4篇
- 中华人民共和国保守国家秘密法实施条例培训课件
- 管道坡口技术培训
- 2024年全国统一高考英语试卷(新课标Ⅰ卷)含答案
- 2024年认证行业法律法规及认证基础知识 CCAA年度确认 试题与答案
- 皮肤储存新技术及临床应用
- 外研版七年级英语上册《阅读理解》专项练习题(含答案)
- 2024年辽宁石化职业技术学院单招职业适应性测试题库必考题
- 上海市复旦大学附中2024届高考冲刺模拟数学试题含解析
- 幼儿园公开课:大班健康《国王生病了》课件
- 小学六年级说明文阅读题与答案大全
- 人教pep小学六年级上册英语阅读理解练习题大全含答案
评论
0/150
提交评论