UNIX环境高级编程
Spring__Rider
这个作者很懒,什么都没留下…
展开
-
第3章 文件I/O
3.1 引言 本章开始讨论UNIX系统,先说明可用的文件I/O函数----打开文件、读文件、写文件等。UNIX系统中的大多数问加你I/O只需用到5个函数:open、read、write、lseek以及close。然后说明不同缓冲长度对read和write函数的影响。 本章描述的函数经常被称为不带缓冲的I/O。术语不带缓冲指的是每个read和write都调用内核中的一个系统调用。...转载 2018-03-07 23:14:23 · 137 阅读 · 0 评论 -
4.8 函数umask
至此我们已说明了与每个文件相关联的9个访问权限位,在此基础上我们可以说明与每个进程相关联的文件模式创建屏蔽字。 umask函数为进程设置文件模式创建屏蔽字,并返回之前的值。(这是少数几个没有出错返回函数中的一个。)#include <sys/stat.h>mode_t umask(mode_t cmask); ...翻译 2018-05-27 02:13:09 · 253 阅读 · 0 评论 -
4.9 函数chmod、fchmod和fchmodat
chmod、fchmod和fchmodat这3个函数使我们可以更改现有文件的访问权限。#include <sys/stat.h>int chmod(const char *pathname, mode_t mode);int fchmod(int fd, mode_t mode);int fchmodat(int fd, const char *pathname, mode_t...翻译 2018-05-28 00:02:45 · 601 阅读 · 0 评论 -
4.16 函数rename和renameat
文件或目录可以用rename函数或者renameat函数进行重命名。#include <stdio.h>int rename(const char * oldname, const char * newname);int renameat(int oldfd, const char *oldname, int newfd, const char *newpath); ...翻译 2018-06-20 23:39:16 · 922 阅读 · 1 评论 -
4.17 符号链接
符号链接是对一个文件的间接指针,它与上一节所述的硬链接由所不同,硬链接直接指向文件的i节点。引入符号链接的原因是为了避开硬链接的一些限制。硬链接通常要求链接和文件位于同一文件系统中。只有超级用户才能创建指向目录的硬链接(在底层文件系统支持的情况下)。 对符号链接以及它指向何种对象并无任何文件系统限制,任何用户都可以创建指向目录的符号链接。符号链接一般用于将一个文件或整个目录结构移到系...翻译 2018-06-21 23:39:05 · 389 阅读 · 0 评论 -
4.18 创建和读取符号链接
可以用symlink或symlinkat函数创建一个符号链接。#include <unstd.h>int symlink(const char * actualpath, const char * sympath);int symlinkat(const char * actualpath, const char * sympath); ...翻译 2018-06-22 01:09:56 · 313 阅读 · 0 评论 -
4.19 文件的时间
在4.2节中,我们讨论了Single UNIX Specification 2008版如何提高stat结构中时间字段的精度,从原来的秒提高到秒加上纳秒。每个文件属性所保存的实际精度依赖于文件系统的实现。对于把时间戳记录在秒级的文件系统来说,纳秒这个字段就会被填充为0.对于时间戳的记录精度高于秒级的文件系统来说,不足秒的值被转换成纳秒并记录在纳秒这个字段中。 对每个文件维护3个时间字段...翻译 2018-06-24 14:12:23 · 259 阅读 · 0 评论 -
4.20 函数futimens、utimenstat和utimes
一个文件的访问和修改时间可以用以下几个函数更改。futimens和utimenstat函数可以指定纳秒级精度的时间戳。用到的数据结构是与stat函数族相同的timespec结构(见4.2节)。#include <sys/stat.h>int futimens(int fd, const struct timespec times[2]);int utimensat(int f...翻译 2018-06-24 14:40:49 · 1339 阅读 · 1 评论 -
4. 21 函数mkdir、mkdirat和rmdir
用mkdir和mkdirat函数创建目录,用rmdir函数删除目录。#include <sys/stat.h>int mkdir(const char *pathname, mode_t mode);int mkdirat(int fd, const char * pathname, mode_t mode); ...翻译 2018-06-24 15:24:46 · 554 阅读 · 0 评论 -
4.22 读目录
对某个目录具有访问权限的任意用户都可以读该目录,但是,为了防止文件系统产生混乱,只有内核才能写目录。回忆4.5节,一个目录的写权限位和执行权限位决定了在该目录中能否创建新文件以及删除文件,它们并不表示能否写目录本身。 目录的实际格式依赖于UNIX系统实现和文件系统的设计。早期的系统(如V7)有一个较简单的结构:每个目录项是16个字节,其中14个字节是文件名,2个字节是i节点编号。而对...翻译 2018-06-24 18:50:48 · 263 阅读 · 0 评论 -
4.23 函数chdir、fchdir和getcwd
每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点(不以斜线开始的路径名为相对路径名)。当用户登录到UNIX系统时,其当前工作目录通常是口令文件(/etc/passwd)中该用户登录项的第6个字段----用户的起始目录(home directory)。当前工作目录是进程的一个属性,起始目录则是登录名的一个属性。 进程调用chdir或fchdir函数可以更改当前工作目录。#...翻译 2018-06-24 19:11:36 · 355 阅读 · 0 评论 -
4.24 设备特殊文件
st_dev和st_rdev这两个字段经常引起混淆,在18.9节,我们编写ttyname函数时,需要使用这两个字段。有关规则很简单:每个文件系统所在的存储设备都由其主、次设备号表示。设备号所用的数据类型是基本系统数据类型dev_t。主设备号表示设备驱动程序,有时编码为与其通信的外设板;次设备号标识特定的子设备。回忆图4-13,一个磁盘驱动器经常包含若干个文件系统。在同一磁盘驱动器上的各文件...翻译 2018-06-24 19:27:10 · 425 阅读 · 0 评论 -
4.25 文件访问权限位小结
我们已经说明了所有文件访问权限位,其中某些位有多重用途。图4-26列出了所有这些权限位,以及它们对普通文件和目录文件的作用。翻译 2018-06-24 19:32:37 · 246 阅读 · 0 评论 -
5.1 引言
本章讲述标准I/O库。不仅是UNIX,很多其他操作系统都实现了标准I/O库,所以这个库由ISO C标准说明。Single UNIX Specification 对ISO C标准进行了扩充,定义了另外一些接口。 标准I/O库处理很多细节,如缓冲区分配、以优化的块长度执行I/O等。这些处理使用户不必担心如何选择使用正确的块长度(如3.9节中所述)。这使得它便于用户使用,但是如果我们不深入...翻译 2018-06-24 23:05:08 · 233 阅读 · 0 评论 -
5.2 流和FILE对象
在第3章中,所有I/O函数都是围绕文件描述符的。当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作。而对于标准I/O库,它们的操作时围绕流(stream)进行的(请勿将标准I/O术语与System V的STREAMS I/O系统相混淆,STREAMS I/O系统是System V的组成部分,Single UNIX Specification则将其标准化为XSI ...翻译 2018-06-24 23:31:25 · 325 阅读 · 0 评论 -
5.3 标准输入、标准输出和标准错误
对一个进程预定义了3个流,并且这3个流可以自动地被进程使用,它们是:标准输入、标准输出和标准错误。这些流引用的文件与在3.2节中提到文件描述符STDIN_FILENO、STOUOT_FILENO和STDERR_FILENO所引用的相同。 这3个标准I/O流通过预定义文件指针stdin、stdout和stderr加以引用。这3个文件指针定义在头文件<stdio.h>中。...翻译 2018-06-24 23:35:03 · 349 阅读 · 0 评论 -
4.13 文件截断
有时我们需要在文件尾端处截去一些数据以缩短文件。将一个文件的长度截断为0是一个特例,在打开文件时使用O_TRUNC标志可以做到这一点。为了截断文件可以调用函数truncate和ftruncate.#include <unistd.h>int truncate(const char * pathname, off_t length);int ftruncate(inf f...翻译 2018-06-19 22:32:32 · 758 阅读 · 0 评论 -
4.7 函数accesss和faccessat
正如前面所说,当用open函数打开一个文件时,内核以进程鹅有效用户ID和有效组ID为基础执行其访问权限测试。有时,进程也希望按其实际用户ID和实际组ID来测试其访问能力。例如,当一个进程使用设置用户ID或设置组ID功能作为另一个用户(或组)运行时,就可能会有这种需要。即使一个进程可能已经通过设置用户ID以超级用户权限运行,它仍可能想验证其实际用户能否访问一个给定的文件。access和facc...翻译 2018-05-22 00:31:49 · 1371 阅读 · 0 评论 -
4.6 新文件和目录的所有权
在第3章中讲述用open或creat创建新文件时,我们并没有说明赋予新文件的用户ID和组ID是什么。4.21节将说明mkdir函数,此时就会了解如何创建一个新目录。关于新目录的所有权规则与本节说明的新文件所有权规则相同。 新文件的用户ID设置为进程的有效用户ID。关于组ID,POSIX.1允许实现选择下列之一作为新文件的组ID。 (1)新文件的组ID可以是进程的有效组ID。...翻译 2018-05-21 22:14:32 · 182 阅读 · 0 评论 -
4.4 设置用户ID和设置组ID
与一个进程相关联的ID有6个活更多,如图4-5所示。实际用户ID 我们实际上是谁 实际组 ID有效用户ID有效组ID 用于文件访问权限检查附属组ID 保存的设置用户ID保存的设置组 由exec函数保存实际用户ID和实际组ID标识我们究竟是谁。这两个字段在登录时取自口令文件中的登录...翻译 2018-05-07 22:12:26 · 301 阅读 · 0 评论 -
第3章 文件I/O
3.2 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符时一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。 按照惯例,UNIX系统shell把文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件...转载 2018-03-07 23:39:26 · 146 阅读 · 0 评论 -
第3章 文件I/O
3.6 函数lseek 每个打开文件都有一个与其相关联的“当前文件偏移量”(current file offset)。它通常是一个非负整数,用以度量从文件开始处计算的字节数(本节稍后对“非负”这一修饰词的某些例外进行说明)。通常,读、写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数。按系统默认的情况,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0. 可以...翻译 2018-04-08 21:52:25 · 118 阅读 · 0 评论 -
第3章 文件I/O
3.7 函数read 调用read函数从打开文件中读数据。#include <unistd.h>ssize_t read(int fd, void *buf, size_t nbytes); 返回值:读到的字节数,若已到文件尾,返回0...翻译 2018-04-10 22:22:29 · 132 阅读 · 0 评论 -
第3章 文件I/O
3.8 函数read调用read函数向打开文件写数据。#include <unistd.h>ssize_t write(int fd, const void *buf, size_t nbytes); 返回值:若成功,返回已写的...翻译 2018-04-10 22:27:56 · 123 阅读 · 0 评论 -
第3章 文件I/O
3.10 文件共享 UNIX系统支持在不同进程间共享打开文件。在介绍dup函数之前,先要说明这种共享。为此先介绍内核用于所有I/O的数据结构。 内核使用3种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。 (1)每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关...翻译 2018-04-16 23:24:59 · 124 阅读 · 0 评论 -
第3章 文件I/O
3.13 函数sync、fsync和fdatasync 传统的UNIX系统实现在内核中设有缓冲区高速缓存或页高速缓存,大多数磁盘I/O都通过缓冲区进行。当我们向文件写入数据时,内核通常先将数据复制到缓冲区中,然后排入队列,晚些时候再写入磁盘。这种方式被称为延迟写。 通常,当内核需要重用缓冲区来存放其他磁盘快数据时,它会把所有延迟写数据块写入磁盘。为了保证磁盘上实际文件系统与缓冲区中内容的一...翻译 2018-04-22 01:41:41 · 105 阅读 · 0 评论 -
第3章 文件I/O
3.9 I/O效率图3-5程序只使用read和write函数复制一个文件。程序略。关于该程序应注意以下几点。它从标准输入读,写至标准输出,这就假定在执行本程序之前,这些标准输入、输出已由shell安排好。确实,所有常用的UNIX系统shell都提供一种方法,它在标准输入上打开一个文件用于读,在标准输出上创建(或重写)一个文件。这使得程序不必打开输入和输出文件,并允许用户利用shell的I/O重定向...翻译 2018-04-12 23:29:46 · 107 阅读 · 0 评论 -
第3章 文件I/O
3.14 函数fcntl fcntl函数可以改变已经打开文件的属性。#include <fcntl.h>int fcntl(int fd, int cmd, ... /* int arg */); 返回值:若成功,则依赖于c...翻译 2018-04-22 22:00:17 · 132 阅读 · 0 评论 -
第3章 文件I/O
3.11 原子操作1、追加到一个文件 考虑一个进程,它要将数据追加到一个文件尾端。早期的UNIX系统版本并不支持open的O_APPEND选项,所以程序被编写成下列形式:if (lseek(fd, OL, 2) < 0) err_sys("lseek error");if (write(fd, buf, 100) != 100) err_sys("write error"...翻译 2018-04-18 23:40:26 · 226 阅读 · 0 评论 -
第3章 文件I/O
3.12 函数dup和dup2下面两个函授都可用来复制一个现有的文件描述符。#include <unistd.h>int dup(int fd);int dup2(int fd, int fd2); 量函数的返回值:若成功,返回新的文件描述符;若出错,返回-...翻译 2018-04-20 23:38:27 · 149 阅读 · 0 评论 -
4.5 文件访问权限
st_mode值也包含了对文件的访问权限。当提及文件时,指的是前面所提到的任何类型的文件。所有文件类型(目录、字符特别文件等)都有访问权限(access permission)。很多人认为只有普通文件有访问权限,这是一种误解。 每个文件都有9个访问权限位,可将它们分成3类,见图4-6.st_mode屏蔽 含义 S_IRUER S_IWUSR S_IXUSR 用户读 ...翻译 2018-05-10 00:50:47 · 368 阅读 · 0 评论 -
第3章
3.15 函数ioctl ioctl函数一直是I/O操作的杂物箱。不能用本章中其他函数表示的I/O操作通常都能用ioctl表示。终端I/O是使用ioctl最多的地方。#include <unistd.h>#include <sys/ioctl.h>int ioctl(int fd, int request, ...); ...翻译 2018-05-03 23:29:55 · 157 阅读 · 0 评论 -
第3章 文件I/O
3.16 /dev/fd 较新的系统都提供名为/dev/fd的目录,其目录项是名为0、1、2等的文件。打开文件/dev/fd等效于复制描述符n。 在下列函数调用中: fd = open("/dev/fd/0", mode);大多数系统忽略它所指定的mode,而另外一些系统则要求mode必须是所引用的文件(在这里是标准输入)初始打开时所使用的打开模式的一个子集。因为上面的打开等效于...翻译 2018-05-03 23:46:18 · 118 阅读 · 0 评论 -
4.1 引言
上一章我们说明了执行I/O操作的基本函数,其中的讨论是围绕普通文件I/O进行的---打开文件、读文件或写文件。本章将描述文件系统的其他特征和文件的性质。我们将从stat函数开始,逐个说明stat结构的每一个成员以了解文件的所有属性。在此过程中,我们将说明修改这些属性的各个函数(更改所有者、更改权限等),还将更详细地说明UNIX文件系统的结构以及符号链接。本章最后介绍对目录进行操作的各个函数,...翻译 2018-05-06 22:31:35 · 185 阅读 · 0 评论 -
4.2 函数stat、fstat、fstatat和lstat
本章主要讨论4个stat函数以及它们的返回信息。#include <sys/stat.h>int stat(const char *restrict pathname, struct stat * restrict buf);int fstat(int fd, struct stat* buf);int lstat(const char *restrict pathname, s...翻译 2018-05-06 22:45:15 · 355 阅读 · 0 评论 -
4.3 文件类型
至此我们已经介绍了两种不同的文件类型:普通文件和目录。UNIX系统的大多数文件时普通文件或目录,但是也有另外一些文件类型。文件类型包括如下几种。 (1)普通文件(regular file)。这是最常用的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据,对于UNIX内核而言并无区别。对普通文件内容的理解由处理该文件的应用程序进行。 (2)目录文件(direct...翻译 2018-05-06 23:02:52 · 244 阅读 · 0 评论 -
4.15 函数link、linkat、unlink、unlinkat和remove
如上节所述,任何一个文件可以有多个目录项指向其i节点。创建一个指向现有文件的链接的方法是使用link函数或linkat函数。#include <unistd.h>int link(const char *existingpath, const char * newpath);int linkat(int efd, const char *existingpath, int nf...翻译 2018-06-19 23:27:49 · 1049 阅读 · 0 评论