1.函数open和函数openat

#include<fcnl.h>
int open(const char *path,int oflag,.../*mode_t mode */)
int openat(int fd,const char *path,int oflag,.../*mode_t mode*/)
//两个函数的返回值:若成功,返回文件描述符;若出错,返回-1

oflag 参数可用来说明此函数的多个选项。用下列一个或者多个常量进行“或运算”构成oflag参数。(常量定义在头文件<fcntl.h>)

O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读、写打开
O_EXEC 只执行打开
O_SEARCH 只搜索打开(应用于目录)
O_APPEND 每次写的时候都追加到文件的末尾
A_CLOSEXEC 把FD_CLOSEXEC常量设置为文件描述符标志
O_CREAT 若该文件不存在,就创建这个文件
O_DIRECTORY 如果path引用的不是目录,则出错
O_EXCL 如果同事指定了O_CREAT,而文件已经存在,则出错。用此可以测试一个文件是否存在,如果不存在,就创建这个文件
O_NOCTTY 如果path引用的是终端设备,则不将该设备分配作为此进程对的控制终端
O_NOFOLLOW 如果path引用的是一个符号链接,则出错
O_NONBLOCK 如果path引用的是一个FIFO,一个块特殊文件或者一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置非阻塞方式
O_SYNC 使得每次write等待物理I/O操作完成,包括由该write操作引起的文件属性更新所需的IO
O_TRUNC 如果此文件存在,而且为只写或者读-写成功打开,则将该长度截断为0
O_TTY_INIT 如果打开一个还未打开的终端设备,设置非标准termios参数值,使其符合Single UNIX Specification
O_DSYNC 使得每次write都要等待物理I/O操作完成,但是如果该写操作并不影响读取刚写入的数据,则不需要等待文件属性被更新
O_REYNC 使得每一个以文件描述符作为参数进行的read操作等待,直至所有对文件同一部分挂起的写操作都完成

通过fd参数把open和openat函数区分开,共有下述3种可能:

  1. path参数指定的是绝对路径的名称,在这个情况下,fd参数被忽略,openat函数相当去open函数
  2. path参数指定的是相对路径名,fd参数支出了相对路径名在文件新系统的开始位置。fd参数是通过打开相对路径名所在的目录来获得的。
  3. path参数指定了相对路径名,fd参数具有特殊值AT_FDCWD。在这种情况下,路径名在当前目录中获取,openat函数在操作上与open函数类似

2.函数create

#include <fcntl.h>
int creat(const char * path,mode_t mode);//创建一个文件
等价于以下调用:
open(path,O_WRONLY|O_CREATE|O_TRUNC,mode)

3.函数close

//可以调用close函数关闭一个打开的文件
#include <unistd.h>
int close(int fd);

4.函数lseek

  可以利用函数lseek为一个打开的文件设置偏移量。

#include <unistd.h>
off_t lseek(int fd,off_t offset,int whence)//此函数的返回值是文件的当前偏移量
/*
其中,whence取值为SEEK_SET,该文件的偏移量设置为距离文件开头offset个字节
若whence为SEEK_CUR,则该文件的偏移量设置为当前值加 offset,offset可正可负
若whence为SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset可正可负
*/

  如果文件的描述符指向一个管道,FIFO或网络套接字,则lseek返回-1,并且将errno设置为ESPIPE。程序实例如下:

#include "apue.h"
#include <iostream>
using namespace std;
int main(){
if(lseek(STDIN_FILENO,,SEEK_CUR)==-)
cout<<"can't seek"<<endl;
else
cout<<"seek OK!"<<endl; return ;
}

输出:can't seek

  可以通过lseek跳过一段长度的空间,创建一个具有空洞的文件。

5.函数read

#include <unistd.h>
ssize_t read(int fd,void *buf,size_t nbytes);
//read成功,返回读到的字节数目。如果已经达到文件的末尾,则返回0

  优肯那个实际读到的字节数小于要求读的字节数目nbytes

6.函数write

  调用函数write函数向打开的文件中写入数据。

#include <unistd.h>
ssize_t write(int fd,const void *buf,size_t nbytes)
//若成功,返回写入的字节数目,若出错,返回-1

7.原子操作-函数pread和函数pwrite

  函数pread和函数pwrite允许原子性地定位并执行I/O。

#include<unistd.h>
ssize_t pread(int fd,void *buf,size_t nbytes,off_t offset);
//返回值:读到的字节数,若已经到达字节尾,返回0,若出错,返回-1
ssize_t pwrite(int fd,const void *buf,size_t nbytes,off_t offset);
//返回值,若成功,返回已经写的字节数目;若出错,返回-1

  调用pread相当于调用lseek后调用read,但是pread又与这种顺序调用有下列重要区别:

  调用pread时,无法中断其定位和读操作;

  不更新当前文件偏移量。

  调用pwrite相当于调用lseek后调用write,但是pwrite又与这种顺序的调用有下列重要区别:

  调用pwrite时,无法中断其定位和写操作;

  不更新当前文件偏移量。

8.函数dup和dup2

  下面两个函数都可以用来复制一个现有的文件描述符。

#include<unistd.h>
int dup(int fd);
int dup2(int fd,int fd2);

  利用函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。例如,如果我们对一个文件描述符执行lseek操作,得到的第一个文件的位置和第二个是一样的

  dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。dup2函数是原子操作。

9.函数sync,fsync,fdatasync

  为了将缓存中的更改写回磁盘,保证缓冲区和文件系统的内容的一致性,需要调用这三个函数。

#include<unistd.h>
int fsync (int fd);
//只对文件描述符fd指定的一个文件起作用,并且等待写磁盘操作结束才返回
int fdatasync(int fd);
//类似于函数fsync,只对文件描述符fd指定的一个文件起作用,并且等待写磁盘操作结束之后才返回。可以用于数据库这样的应用程序。
void sync(void );
//将修改过的缓冲区排入写队列,然后返回,不等待实际磁盘操作结束。 返回值:如果成功就返回0,否则返回-1

10.函数 fcntl

  fcntl函数可以改变已经打开的文件的属性。

#include<fcntl.h>
int fcntl(int fd,int cmd,.../*int arg*/)
//返回值 :若成功,则依赖于cmd;若出错,返回-1

  fcntl函数有以下5种功能:

(1)复制一个已有的描述符(cmd=F_DUPFD或F_DUPED_CLOSEXEC)

(2)获取/设置文件描述符标识(cmd=F_GETFD或者F_SETFD)

(3)获取/设置文件状态标识(cmd=F_GETFL或者F_SETFL)

(4)获取/设置文件状态标识(cmd=F_GETOWN或者F_SETOWN)

(5)获取/设置记录锁(cmd=F_GETLK,F_SETLK或者F_SETLKW)

  

apue- chapter 3 文件IO的更多相关文章

  1. apue chapter 4 文件和目录

    1.文件信息结构体 struct stat{ mode_t st_mode; //file type and permissions ino_t st_ino; //i-node number (se ...

  2. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  3. APUE学习笔记3_文件IO

    APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...

  4. APUE 文件IO

    文件 IO 记录书中的重要知识和思考实践部分 Unix 每个文件都对应一个文件描述符(file descriptor),为一个非负整数,一个文件可以有多个fd, 后面所有与文件(设备,套接字等)有关操 ...

  5. C3 文件IO:APUE 笔记

    C3:文件IO 1 引言 本章描述的函数被成为不带缓冲的IO,涉及5个函数:open.read.write.lseek.close. 文件控制:dup.sync.fsync.fdatasync.fcn ...

  6. 《嵌入式linux应用程序开发标准教程》笔记——6.文件IO编程

    前段时间看APUE,确实比较详细,不过过于详细了,当成工具书倒是比较合适,还是读一读这种培训机构的书籍,进度会比较快,遇到问题时再回去翻翻APUE,这样的效率可能更高一些. <嵌入式linux应 ...

  7. 无缓冲文件IO和目录操作

    引言 在后台开发中,对于文件I/O我们通常不使用C语言封装的fopen.fread.fwrite标准I/O,而是直接使用Linux提供的系统调用函数.因为这些系统调用没有使用用户缓冲区,我们直接与内核 ...

  8. 标准io与文件io

    A: 代码重复: 语句块1: while(判断) { 语句块2: 语句块1: } 上面可以改写为: while(1) { 语句块1: if(判断) break: 语句块2: } B: 标准IO和文件I ...

  9. 配置apue的头文件apue.h和unp的头文件anp.h

    配置apue的头文件apue.h和unp的头文件anp.h 如果要使用gcc -g 来生成可调试文件一定要修改Make.defines.linux文件中的CFLAGS变量 修改为:CFLAGS=-an ...

  10. 文件IO函数和标准IO库的区别

    摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...

随机推荐

  1. nat和打洞

    http://michankong.blog.51cto.com/1464983/761270 可能有点乱,下面以故事的形式叙述一下这个情景. 人物:A(男) NAT_A(A家接线员) B(女) NA ...

  2. dotnet webservice处理数据量过大,ajax请求返回500错误解决方案

    ajax请求webservice返回json数据,数据规模过大时ajax请求会得到500的响应,webservice+ajax处理大规模的数据需要在web.config中进行如下配置: <sys ...

  3. XML简单的增改删操作

    XML文件的简单增改删,每一个都可以单独拿出来使用. 新创建XML文件,<?xmlversion="1.0"encoding="utf-8"?> & ...

  4. 给ThinkPHP5增加验证码功能

    就在这几天,TP5进行的RC3的大规模更新,虽然我们都狠狠地骂了一百遍,但是我的内心是无比的激动,TP终于走上了"上流社会"的模式:composer! 为什么说composer是上 ...

  5. 基于心跳的socket长连接

    http://coach.iteye.com/blog/2024444 基于心跳的socket长连接 博客分类: http socket 案例: 心跳: socket模拟网页的报文连接某个网站,创建t ...

  6. git log 查看 当前分支的 提交历史

    git log  查看 当前分支的 提交历史 在提交了若干更新之后,想回顾下提交历史,可以使用 git log 命令查看 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排 ...

  7. php使用curl设置超时的重要性

    原文:http://phpquan.com/lamp/php/php-curl-timeout/ 网站登录不了,原因是没有可用的 PHP 子进程来响应新的请求了.这可能是是由于PHP-curl  没有 ...

  8. php 命名空间的目的

    php引入命名空间的目的,就是为了防止不同的文件 标识符同名的问题,比如类.函数.变量同名导致冲突的问题.这才是根本的根本,了解指点,带着这个观念去学习php命名空间的相关知识,就不会云里雾里了,会比 ...

  9. ural1987 Nested Segments

    Nested Segments Time limit: 1.0 secondMemory limit: 64 MB You are given n segments on a straight lin ...

  10. 向datagridview 添加行

    datagridview 已经绑定数据源且控件的AllowUserToAddRows设置为false时. ((DataTable)dataGridView1.DataSource).Rows.Add( ...