初学APUE-book-3重点摘入

一.关于函数read的补充

    1.读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,诺在到达文件尾端之前有30个字节,而要求100个字节,则read返回30。下一次在调用read时,他将返回0.
    2.当从终端设备读时,通常一次最多读一行。(可改变)
    3.当从网络读时,网络中的缓冲机制可能照成返回值小于所要求读的字节数。
    4.当从管道或FIFO读时,如诺管道包含的字节数所需的数量,那么read将只返回实际可用的字节数。
    5.当从某些面向记录的设备读时,一次最多返回一个记录。
    6.当一信号照成中断,而已经读了部分数据量时。读操作从文件的当前偏移量处开始,在成功返回之前,该偏移量将增加实际读到的字节数。    

二.I/O效率

    使用read和write函数复制一个文件
初学APUE-book-3重点摘入
初学APUE-book-3重点摘入
三.文件共享
    内核使用3种数据结构表示打开文件,他们之间的关系决定了在文件共享方面一个进程对另外一个进程可能产生的影响。
    (1)每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述符表,可将其视为一个矢量,每个描述符占用其中一项。与每个文件描述符相关联的是:
    a.文件描述符标志;
    b.指向一个文件表项的指针。
    (2)内核为所有打开文件维持一张文件表。每个文件表项含:
    a.文件状态标志;
    b.当前文件偏移量;
    c.指向该文件v节点表项的指针
    (3)每个打开文件都有一个v节点结构。v节点结构包含了文件类型和对此文件进行的各种操作函数的指针。对于大多数文件,v节点还包含了该文件i节点。这些信息实在打开文件时从磁盘读入内存的,所以文件的所有相关信息都是随时可用的。

四.原子操作

    1.追加到一个文件 
    主要利用的是函数open()中的尾部追加O_APPEND防止问题处在因为内核调度问题(A、B等多个进程写文件时偏移量产生的问题,具体参考APUE P62)
    2.函数pread和pwrite
    #include<unistd.h>
    ssize_t pread(int fd,void buf[],size_t nbytes,off_t offset)
    ssize_t pwrite(int fd,void buf[],size_t nbytes,off_t offset)
说明:
    (1)调用pread相当于调用lseek后调用read,但是pread又与这种顺序调用有下列重要区别。
    (2)调用pread时,无法中断其定位和读操作。
    不更新当前偏移量。
    调用pwrite相当于调用lseek后调用write,但也与他们有类似的区别。
    3.创建一个文件
    open函数的O_CREAT和O_EXCL选项说明时,我们已见到另外一个有关原子操作的例子。

五./dev/fd

    较新的系统都提供名为/dev/fd的目录,期目录项是名0、1、2等的文件。打开文件/dev/fd/n等效于复制描述符n(假定n是打开的)
    fd = open("/dev/fd/0",mode)等效于fd=dup(0)
    /dev/fd文件主要由shell使用,它允许使用路径名作为调用参数的程序,能用处理其他路径名的相同方式处理标准输入和输出。