以下内容是我看《APUE》第二版第三章的笔记,有错还希望指出来,谢谢。

unbuffered I/O,跟buffered I/O相对,buffered I/O就是 ISO C标准下的标准输入输出函数,而unbuffered I/O就是POSIX下的函数。

文件描述符,个人理解就相当于Linux下的UID,GID那样具有系统标识性的数字。系统对哪个哪个文件操作主要认的就是文件描述符。按照惯例,在UNIX的shell下,0代表标准输入,1代表标准输出,2就代表标准出错输出。在遵从POSIX的应用程序下,0就定义成STDIN_FILENO,1定义成STDOUT_FILENO,2定义成STDERR_FILENO。这些常量都定义在头文件<unistd.h>。早期的UNIX最多允许同时打开20个文件,现在则增加至63个。

无缓冲IO主要操作的几个函数是open,read,write,lseek,close。接下来稍微的说以下这几个函数的用法。

open函数:

调用open函数可以打开或创建一个文件。

#include <fcntl.h>

int open(const char *pathname, int oflag, ... /* mode_t mode */);

返回值:若成功则返回文件描述符,出错则返回-1

当需要创建一个新文件的时候才需要用到第三个参数mode,用来制定权限(因为我现在看到第三章,而权限在第四章才讲,虽然我也知道,但是还是留到写第四章的笔记的时候再说明吧)。

pathname是要打开或创建文件的名字,相对绝对路径什么的应该都懂吧。

oflag参数可以说明怎么打开这个文件。用下列一个或多个常量进行“或“运算来构成oflag参数。(这些常量定义在<fcntl.h>头文件中)。

O_RDONLY    只读打开(0)

O_WRONLY   只写打开(1)

O_RDWR        读、写打开(2)

上述参数必须也只能指定一个,下列常量则是可选的:

O_APPEND     在文件的末尾段追写

O_CREAT        若文件不存在,则创建它。需要用到第三个参数model

O_EXCL

O_TRUNC       如果此文件存在,而且为只写或读写成功打开,就将它的长度截断为0(就是清空文件内容分吧)

O_NOCTTY     如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端。(额,现在暂时看不太懂,懂的朋友可以跟我解释一下,谢谢。)

O_NONBLOCK (完全不懂就不写了,等到时候用上在补回)

下面的三个选项也是可选的,是关于同步输入和输出的,有兴趣可google一下:

O_DSNYC

O_RSNYC

O_SNYC

如果pathname太长的话,早期的系统V版本(如SVR2)会直接截掉,而且不给出任何信息;而BSD类的系统则会返回出错状态,并将errno设置为ENAMETOOLONG。

creat函数

也可以调用creat函数来创建一个新文件。

#include <fcntl.h>

int creat(const char *pathname, mode_t mode);

返回值:成功返回文件描述符,出错返回-1

此函数等效于:

open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);

close函数

可调用close函数关闭一个打开的文件

#include <unistd.h>

int close(int filedes);

返回值:成功返回0,出错返回-1

lseek函数

每一个打开的文件都有一个与其相关联的“当前文件偏移量”(current file offset)。它通常是一个非负整数。

通常,读、写操作都是从当前文件偏移量开始的,并使偏移量增加所读写的字节数。默认情况下,除非是追尾操作,一般偏移量都设置为0.

#include <unistd.h>

off_t lseek(int filedes, off_t offset, int whence);

返回值:若成功则返回新的文件偏移量,出错返回-1

若whence是SEEK_SET(0),则将该文件的偏移量设置为据文件开始处的offset个字节。

若whence是SEEK_CUR(1),则将该文件的偏移量设置为其当前值加offset,offset可正可负。

若whence是SEEK_END(2),则将该文件的偏移量设置为文件长度加offset,offset可正可负。

要是文件偏移量超过本身文件的长度的话,就会形成空洞文件。

这是书上的例子:

/* Create a file wtih a hole in it */
#include "apue.h"
#include <fcntl.h> char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ"; int main(void)
{
int fd; if ((fd = creat("file.hole", FILE_MODE)) < 0)
err_sys("creat error"); if (write(fd, buf1, 10) != 10)
err_sys("buf1 write error");
/* offset now = 10 */ if (lseek(fd, 16384, SEEK_SET) == -1)
err_sys("lseek error");
/* offset now = 16384 */ if(write(fd, buf2, 10) != 10)
err_sys("buf2 write error");
/* offset now = 16394 */ exit(0); }

用od -c 命令来查看:

虽然我现在还是觉得有点不太懂,但是以后应该会遇到吧。

第三章笔记待续。

《APUE》第三章笔记(1)的更多相关文章

  1. 《APUE》第三章笔记(3)

    文件共享 UNIX系统支持在不同进程中共享打开的文件,首先先用一幅apue的图来介绍一下内核用于I/O文件的数据结构: 如图所见,一个进程都会有一个记录项,记录项中包含有一张打开文件描述符表,每个描述 ...

  2. 《APUE》第三章笔记(2)

    read函数 调用read函数从打开的文件中读数据. #include <unistd.h> ssize_t read(int filedes, void *buf, size_t nby ...

  3. 【转】《APUE》第三章笔记(4)及习题3-2

    原文网址:http://www.cnblogs.com/fusae-blog/p/4256794.html APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. ...

  4. 《APUE》第三章笔记(4)及习题3-2

    APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. dup和dup2函数:用来复制文件描述符的 sync函数,fsync函数和fdatasync函数:大致的功 ...

  5. HBase in Action前三章笔记

    近期接触HBase,看了HBase In Action的英文版.開始认为还行,做了些笔记.可是兴许看下去,越来越感觉到实战这本书比較偏使用上的细节,对于HBase的具体设计涉及得很少.把前三章的一些笔 ...

  6. 《HALCON数字图像处理》第三章笔记

    目录 第三章 HALCON图像处理基础 HALCON控制语句 HALCON算子 HALCON图像处理入门 HALCON图像读取 HALCON图像显示 图形窗口 图像显示 显示文字 HALCON图像转换 ...

  7. [ APUE ] 第三章 文件系统

    1. 文件描述符 打开或创建一个文件时,内核向进程返回一个文件描述符,当读.写一个文件时,用open()或creat()返回的文件描述符标识该文件,将其作为参数传递给write.read. stdin ...

  8. unix环境高级编程第三章笔记

    文件描述符 1.文件描述符的概念 对于内核而言,所有打开的文件都会用一个文件描述符来引用,打开或和创建一个新文件的时候,内核会给进程返回一个文件描述符,而当使用read write时,可以使用这个文件 ...

  9. Vue2.5开发去哪儿网App 第三章笔记 上

    1.  vue 生命周期函数 每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 ...

随机推荐

  1. linuxmint获取root

    1.进入系统à点击桌面左下角的菜单à点击系统设置 2. 在系统设置里面找到登陆窗口并进去 3.打入自己设置的开机登陆密码 4. 选择选项,并把运行root登陆的勾打上 5.重启生效

  2. Android ArrayAdpater 填充集合

    在这里我们新创建一个任务来演示 然后再布局文件中定义一个ListView 来当作显示数据的容器,布局文件代码如下: <LinearLayout xmlns:android="http: ...

  3. C#获取内存图像数据流的方法

    背景:有的时候我们已经得到一个图像的内存对象,如Bitmap对象,我们想要获取到这个对象的数据流,可以将其序列化到磁盘上,并且也可以反序列化为内存对象,这个时候就有了如题的问题出现,我搜遍全网就是没有 ...

  4. 宽字节SQL注入

    1.联想lelink站 例1, 联想lelink站user参数存在宽字节SQL注入 提交,user=wctest%df’ and 1=2%23 结果,出现了”運”字,如图:

  5. UIPickerView(选择器)

    UIPickerView也是一个选择器控件,它比UIDatePicker更加通用,它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活. UIPicke ...

  6. 页面常见效果js实现

    2015.12.2 页面常见效果js实现 [有没有觉得很坑,[笑哭,邮箱写上]] 复习: Js内置对象: 1.浏览器对象 window document history location event  ...

  7. HTTP请求、响应报文格式

    HTTP请求报文格式: HTTP请求报文主要由请求行.请求头部.空行以及请求正文4部分组成 1,请求行由3部分组成,分别为:请求方式,URI(注意这里不是URL)以及协议版本组成,之间由空格分隔 请求 ...

  8. Hibernate事务管理

    User类: public class User implements Serializable{ public User(){} private Integer id; private String ...

  9. JVM OOM处理

    一般OOM可能情况如下: 1.OutOfMemoryError: Java heap space: 2.OutOfMemoryError: PermGen space: 3.OutOfMemoryEr ...

  10. Nuget 自动上传

    1:参考https://newnugetpackage.codeplex.com/wikipage?title=NuGet%20Package%20To%20Create%20A%20NuGet%20 ...