4.28 UNIX环境高级编程 笔记

int dup(int filedes);

int dup2(int filedes,int filedes2);

这两个函数都可以实现复制一个现存的文件描述符,但是dup一定返回当前可用最小文件描述符,dup2可以用filedes2参数指定新描述符数值。如果filedes2已经打开,则先将其关闭。如果filedes等于filedes2,则返回filedes2而不关闭。

这些函数返回的新文件描述符与参数参数filesdes共享同一个文件表项。

图3 执行dup之后的内核数据结构

dup2是原子操作,相当于重定向,将第二个文件描述符重定向到第一个文件描述符指向的文件表,并关闭第二个文件描述符之前的文件表项

close(fd)直视关闭了文件描述符

sync刷新所有修改过的块缓冲区

fsync只对文件描述符置顶的文件起作用

fdatasync类似fsync但是只影响文件数据部分,不更新文件属性

fcntl根据参数不同可以:复制一个现有描述符;获得、设置文件描述符标记;获得、设置文件状态标记;获得、设置异步IO所有权;获得、设置记录锁

修改文件描述符标志或者文件状态标志时必须谨慎,要先取得现有标志值,然后根据需要修改它,最后设置新标志值。不能直视执行F_SETFD/f_setfl命令,这样会关闭以前设置的标志位。

4.28 UNIX环境高级编程 笔记,码迷,mamicode.com

时间: 2024-12-26 21:09:06

4.28 UNIX环境高级编程 笔记的相关文章

UNIX环境高级编程笔记之文件I/O

一.看图说话 一图胜过千言,看图! 二.唠一唠 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书,也看过一些,但好像没有留下什么印象,今天再看,依然觉得像新的一样.很大的原因我想是一直以来都在用windows(用windows做开发为什么学不到真正的技术,我想大家都懂的),当然知识结构不完整,学习能力这些就不说了.所以,对于那些致力于想在Linux下做开发的人来说,

unix环境高级编程笔记(3)-- 文件I/O(2)

本文讨论如何在多个进程间共享文件,以及所涉及的内核数据结构.然后会介绍dup,dup2,fcntl等函数的使用. 1 数据结构 内核使用三种数据结构表示打开的文件: (1)每个进程在进程表中都有一个记录项,记录项中有一张打开文件文件描述符表,每项包括: a )文件描述符标志(close_on_exec) b)指向一个文件表的指针 (2)内核为所有打开的文件维护一张文件表,每个文件表项包括: a)文件状态标志(读 写  添加  同步和非阻塞) b)  当前文件偏移量 c)  指向v节点的指针 (3

unix环境高级编程笔记(2)-- 文件I/O之不带缓冲的I/O

1 引言 不带缓冲区的I/O(unbuffered I/o)是指每个read 和 write 都调用内核中的一个系统调用,这些不带缓冲区的I/O 不是ISO C 的组成部分. 2 文件描述符 每个打开的文件都通过文件描述符引用,文件描述符是一个非负整数.open 和 create 函数返回的文件描述符供 read write 和 close 使用. unix中文件描述符0与标准输入相关联,文件描述符1与标准输出相关联,文件描述符2与标准出错输出相关联. 3 不带缓冲区的I/O函数 下面介绍6个常

unix环境高级编程笔记(4)—— 文件和目录(1)

1 引言 本文将描述文件系统的一些特征和文件的性质,从stat函数开始,逐个讲解stat结构的成员以了解文件的属性. 2 stat,fstat 和 lstat函数 #include <sys/stat.h> int stat(const char *restrict pathname,struct stat *restrict buf); int fstat(int filedes,struct stat *restrict buf); int lstat(const char *restri

UNIX环境高级编程笔记之高级I/O

本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O(mmap函数)

unix环境高级编程笔记(5)—— 文件和目录(2)

1 文件截短 有时我们需要把文件尾端处截去一些数据以缩短文件,将一个文件清0是一个特例.在打开文件时使用O_TRUNC标志可以做到这一点. #include <unistd.h> int truncate(const char *pathname,off_t length); int ftruncate(int filedes,off_t length); 成功返回0,出错返回-1. 如果length 小于文件长度,则使文件长度截断至length,剩下的不可访问.如果length大于文件长度,

UNIX环境高级编程笔记之线程

本章涉及到线程的一些基本知识点,讨论了现有的创建线程和销毁线程的POSIX.1原语,此外,重点介绍了线程同步问题,讨论了三种基本的同步机制:互斥量.读写锁.条件变量.

unix环境高级编程笔记(6)—— 文件和目录(3)

这一节主要是讲目录的操作,涉及创建目录.删除目录.读取目录等 1 mkdir 和 rmdir 用mkdir创建目录,用rmdir删除目录. #include <sys/stat.h> int mkdir(const char *pathname,mode_t mode); 成功返回0,出错返回-1. 此函数创建一个新的空目录,. 和.. 自动创建,文件访问权限mode由进程的文件模式创建屏蔽字进行修改.(必须指定一个执行权限位) #include <unistd.h> int rm

《Unix环境高级编程》读书笔记 第3章-文件I/O

1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会自动缓冲,每个read和write都调用内核中的一个系统调用.但是,所有磁盘I/O都要经过内核的块缓存区(也称为内核的缓冲区高速缓存).唯一例外的是对原始磁盘设备的I/O. 2. 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数,其变化范围是0~OPEN_MAX