TLPI(liunx/unix系统编程手册)笔记(四) 深入探究文件I/O

本章的重点我想就是原子操作,避免在几个进程在打开同一文件的时候造成的错误,了解一下时间片的概念会对本章有所帮助。

(1)独占方式打开文件。(open     <-O_CREAT)

  知道,open,可以创建文件并返回fd。当我们的进程运行到open这个函数时间片到了,另一个进程也对这个路径的文件open,那么时间片结束后两个进程都会认为自己是这个文件的拥有者。并未是独占创建打开的。在open 函数的第二个参数中有 O_EXCL 这种打开方式,可以解决独占的问题。另外可以在多进程对一个文件写的时候,会出现offset混乱的情况,如果是在文件后写入的话,就用O_APPEND.

(2)相关函数。

  <1>fcntl()

NAME
       fcntl - manipulate file descriptor

SYNOPSIS
       #include <unistd.h>
       #include <fcntl.h>

       int fcntl(int fd, int cmd, ... /* arg */ );

 第三参数可以省略,根据二参数cmd来确定。具体的可以参考man手册。

 下面是man手册上的摘录:

   Duplicating a file descriptor  创建文件描述符的副本
       F_DUPFD (long)
              Find the lowest numbered available file descriptor greater than or equal to arg and make it be a copy of fd.  This is differ‐
              ent from dup2(2), which uses exactly the descriptor specified.
              创建的副本的文件描述符是当前系统里最大的加一。dup2之后会说
              On success, the new descriptor is returned.
         返回值是新的文件描述符
       F_DUPFD_CLOEXEC (long; since Linux 2.6.24)
              As for F_DUPFD, but additionally set the close-on-exec flag for the duplicate descriptor.  Specifying  this  flag  permits  a
              program  to avoid an additional fcntl() F_SETFD operation to set the FD_CLOEXEC flag.  For an explanation of why this flag is
              useful, see the description of O_CLOEXEC in open(2).复制时增加O_CLOEXEC标志

  

   File descriptor flags  获取修改访问模式和状态标志
       The following commands manipulate the flags associated  with  a  file  descriptor.   Currently,  only  one  such  flag  is  defined:
       FD_CLOEXEC, the close-on-exec flag.  If the FD_CLOEXEC bit is 0, the file descriptor will remain open across an execve(2), otherwise
       it will be closed.
  File status flags
    Each open file description has certain associated status flags, initialized by open(2) and possibly modified by fcntl(). Duplicated
    file descriptors (made with dup(2), fcntl(F_DUPFD), fork(2), etc.) refer to the same open file description, and thus share the same
    file status flags.

       F_GETFD (void)  获取
              Read the file descriptor flags; arg is ignored.

       F_SETFD (long)  修改
              Set the file descriptor flags to the value specified by arg.

  修改O_RDONLY和O_WRONLY是需要注意,并不是像mask一样,它是按顺序设置宏的。需要与上O_ACCMODE。

  还有很多。。。就不一一列举,用到直接man手册

  <2>dup()--dup2()

  复制一个fd。

  dup2复制并替换成参数二。

       #include <unistd.h>

       int dup(int oldfd);
       int dup2(int oldfd, int newfd);

       #define _GNU_SOURCE             /* See feature_test_macros(7) */
       #include <unistd.h>

       int dup3(int oldfd, int newfd, int flags);

    <3>pread() and pwrite()

    不影响offset的原子读写操作适合多线程。

       #include <unistd.h>

       ssize_t pread(int fd, void *buf, size_t count, off_t offset);

       ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

    <4>readv() and writev()

    矢量输入输出,分散读,集中输入。 

       #include <sys/uio.h>

       ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

       ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

       ssize_t preadv(int fd, const struct iovec *iov, int iovcnt,
                      off_t offset);

       ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt,
                       off_t offset);

    <5>truncate() and ftruncate()

    截断文件。

 

       #include <unistd.h>
       #include <sys/types.h>

       int truncate(const char *path, off_t length);
       int ftruncate(int fd, off_t length);

(3)文件描述符和打开文件之间的关系

    主要有三个表:进程级文件描述符表;系统级文件描述符表;文件系统的i-node表;

    进程级的有fd号,系统级的有offset,状态,inode指针,文件系统的有文件类型,文件锁等文件元信息;

  下面是书上的关系图:

并不是一一对应的,可以打开很多次。

(4)大文件IO

   32位架构中文件大小置于2GB的限制下面。大于其就是会出错EOVERFLOW。

   使用宏_FILE_OFFSET_BITS 64 就可以打开大文件。还有一种放法就是把带有offset参数的函数后面加64,如open64()。

(5)创建零时文件tmpfile

会有安全问题的函数是tmpnam(),tempnam(),mktemp().

安全的是tmpfile(),打开自带O_EXCL标志,防止之前所说的争抢的现象。

————————————————————finish

时间: 05-19

TLPI(liunx/unix系统编程手册)笔记(四) 深入探究文件I/O的相关文章

TLPI(liunx/unix系统编程手册)笔记(三) 文件IO:通用的IO模型

读下来总的就是介绍了四个IO的API--open,read,write,close. 大家都是知道的,everything is file,在linux系统里面一切都是看作文件来操作的,学习linux就得先学好文件IO,也可以看见TLPI这本书的介绍完一些概念之后就开始介绍文件IO了. IO,大概的分为磁盘文件IO,buffering(缓冲)IO.貌似缓冲的水很深,之后会写博客. ------------------------------------ (1)文件描述符. 在进行IO操作之前,总

TLPI(liunx/unix系统编程手册)初读笔记

当然我只是记录一下我初读这本书的想法和我自己不懂该记下的地方,其他的地方就不一一论述,全部记下来就没有意思了. 若有什么错误,望大家指出,谢谢~希望有评论~ ------------------------------------------------------------------ 前言就是明确的介绍书的目的编程标准等等..source code在http://man7.org/大家可以去参阅 一章介绍POSIX标准和一些历史发展. 二章开始介绍基本概念: 讲到了内核的功能:1.提供了文

《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

<Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h>文件中的常量. 通过cat 命令查看: [email protected]:~/Code/tlpi$ cat /usr/include/limits.h /* Copyright (C) 1991, 1992, 1996, 1997, 1998, 1999, 2000, 2005 Free Software

《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候都会发生缓冲.通过缓冲可以在一定程度上将用户空间与实际的物理设备分离,还可以减少内核访问磁盘的次数. 先来看看关于内核缓冲区高速缓冲:read和write调用在对磁盘文件进行操作的时候不会直接访问磁盘,如下图所示. 例如:write(fd, "abc", 3) write调用会将"

《Linux/Unix系统编程手册》读书笔记9(文件属性)

<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有更深入的研究一定会写出来. 下图为磁盘分区与文件系统的关系 文件系统中的文件(目录)在i-node表上都有唯一的记录(i-node).i-node通过数据块指针指向数据块,这些数据块就是该i-node对应的文件的数据. i-node与数据块的关系如下: 因为Linux支持很多类型的文件系统,但是每种文件系统的

Linux/Unix系统编程手册--SOCKET章节读书笔记

SOCKET章节读书笔记 强烈推荐Linux/Unix系统编程手册,号称超越APUE的神书. backlog含义 #include <sys/socket.h> int listen(int socketfd, int backlog) backlog参数限制未决连接(未accept)的数量,在这个数量之内,connect会立刻成功. Linux上上限为128,定义在 udp已连接socket udp socket也是可以调用connect()的,这种叫已连接socket,内核会记录这个soc

Linux/UNIX系统编程手册 PDF下载

网盘下载地址:Linux/UNIX系统编程手册 PDF下载 – 易分享电子书PDF资源网 作者: Michael Kerrisk 出版社: 人民邮电出版社 原作名: The Linux Programming Interface: A Linux and UNIX System Programming Handbook 译者: 孙剑 许从年 董健 / 孙余强 郭光伟 陈舸 出版年: 2014-1 页数: 1176 定价: 158 装帧: 平装 内容简介 · · · · · · <linux/un

UNIX环境编程学习笔记(13)——文件I/O之标准I/O流

lienhua342014-09-29 1 标准 I/O 流 之前学习的都是不带缓冲的 I/O 操作函数,直接针对文件描述符的,每调用一次函数可能都会触发一次系统调用,单次调用可能比较快捷.但是,对于需要频繁进行 I/O 操作的程序,频繁触发系统调用产生的消耗太大. 标准 I/O 库提供了带缓冲的 I/O 操作函数,这些函数围绕着一种叫做流(stream)的东西进行.当使用标准 I/O 库打开或创建一个文件时,系统提供了一个流与这个文件相关联.通过流的读入和输出完成所需要的 I/O操作. 标准

UNIX环境编程学习笔记(6)——文件I/O之判断文件类型

lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: (1) 普通文件(regular file) 这种文件包含了某种形式的数据,这些数据无论是文件还是二进制对于 UNIX 内核而言都是一样的.对普通文件内容的解释有处理该文件的应用程序进行. (2) 目录文件(directory file) 目录文件包含了其他文件的名字以及指向与这些文件有关信息的指