Linux应用程序编程
Posted Jocelin47
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux应用程序编程相关的知识,希望对你有一定的参考价值。
一、POSIX文件I/O编程
1.1 文件描述符
POSIX文件操作同样也是以文件描述符来标识一个文件,与ANSI文件描述符不同的是,POSIX文件描述符是int类型的一个整数值。
POSIX文件描述符仅是一个索引值, 代表内核打开文件记录表的记录索引。在一个系统中,文件打开关闭比较频繁,因此同一个POSIX 文件描述符的值在不同时间可能代表不同的文件。
Linux系统下默认一个进程最多可以打开1024个文件,用户可以通过ulimit -n查看系统允许打开文件的数量。
stdin、stdout、stderr 文件描述符分比为0,1,2,使用fileno()函数可以返回一个流对应的文件描述符。
1.2 创建/打开/关闭文件
open()函数打开一个文件,在指定一定参数(O_CREAT - 创建文件)的情况下,会隐含调用creat()函数创建文件。open和creat函数定义如下:
其中,sys/types.h包含基本系统数据类型;sys/stat.h包含文件状态;fcntl.h包含文件控制定义。
(1) open函数
flags参数指定打开文件的方式,参数如下表所示:
O_TRUNC -文件存在且允许写,则清空文件
其中open函数给出两种定义,第二种多了mode参数,在flag参数指定为O_CREAT参数时,mode参数用于设置文件的权限,如下表所示:
在创建新文件时,参数mode指定了文件的权限,但是通常会被umask修改,实际创建时的权限为mode&(~umask)。注意,mode仅在创建新文件时有效
open打开失败时,会返回-1,并且设置预定的全局变量errno,下表为出错代码及意义。
创建新文件后,文件的atime(上次访问时间)、ctime(创建时间)、mtime(修改时间)都被修改为当前时间,文件的上层目录的atime和ctime也被修改。另外,如果打开时使用了O_TRUNC参数,则ctime和mtime被设置为当前时间。
(2)creat函数
(3)close函数
通常关闭文件的返回值不需要检查,除非系统使用wirte-behind技术,即数据没有写会文件中。使用NFS网络文件系统时保存文件,建议关闭文件时检查返回值,防止文件写入错误。出错代码如下:
1.3 读写文件内容
(1)write函数
write函数向参数fd代表的文件描述符引用的文件写数据。参数buf是写入数据的缓冲开始地址,参数count表示要写入多少字节的数据。
写入成功返回0,失败返回-1且设置errno代码,错误代码如下:
(2)read函数
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0
参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。注意这个读写位置和使用ANSI C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。比如用fgetc读一个字节,fgetc有可能从内核中预读1024个字节到I/O缓冲区中,再返回第一个字节,这时该文件在内核中记录的读写位置是1024,而在FILE结构体中记录的读写位置是1。注意返回值类型是ssize_t,表示有符号的size_t,这样既可以返回正的字节数、0(表示到达文件末尾)也可以返回负值-1(表示出错)。
read函数返回时,返回值说明了buf中前多少个字节是刚读上来的。有些情况下,实际读到的字节数(返回值)会小于请求读的字节数count,例如:读常规文件时,在读到count个字节之前已到达文件末尾。例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,下次read将返回0。
1.4 文件内容定位
通过lseek函数设置文件偏移量
使用参数whence指定的方式,按照参数offset指定的偏移设置参数fildes,指定文件的偏移量。
whence的三种设置方式:
对于一个管道或FIFO,使用lseek函数会返回-1,errono设置为EPIPE,代码如下;
off_t curr_pos;
curr_pos = lseek(fd, 0, SEEK_CUR);
上面方式可以得到文件当前偏移量。
1.5 修改已打开文件的属性
fcntl函数获取或改变已打开文件的性质
问题1:fwrite都是带缓冲区的,wrtie不带缓冲区,了解一下具体的区别?
以上是关于Linux应用程序编程的主要内容,如果未能解决你的问题,请参考以下文章