UNIX再学习 -- 文件I/O

Posted 聚优致成

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNIX再学习 -- 文件I/O相关的知识,希望对你有一定的参考价值。

在 UNIX/Linux 系统中,一切皆文件,这句话想必都有听过。对于文件的操作几乎适用于所有的设备,这也就看出了文件操作的重要性了。在C语言再学习部分有讲过标准I/O文件操作,参看:C语言再学习 -- 文件 下面我们来讲解下系统文件I/O的。

一、文件描述符

1、文件描述符简介

首先从文件描述符开始讲起。因为,对于内核而言,所有打开的文件都是通过文件描述符引用的。那么文件描述符到底是什么?

文件描述符(file descriptor)通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,使用 open 或 create 返回的文件描述符标识该文件,将其作为参数传送给 read 或 write。

2、标准输入、标准输出和标准错误

按照惯例,UNIX 系统 shell 把文件描述符 0 与进程的标准输入(standard input)关联,文件描述符 1标准输出(standard output)关联,文件描述符 2标准错误(standard error)关联。这是各种 shell 以及很多应用程序使用的惯例,与 UNIX 内核无关。尽管如此,如果不遵循这种惯例,很多 UNIX 系统应用程序就不能正常工作。

这部分讲 shell 编程重定向时,可参看UNIX再学习 -- shell编程

POSIX 定义了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2。这三个符号常量的定义位于头文件 <unistd.h>

查看 /usr/include/unistd.h
/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */
文件描述符的有效范围是 0 到 OPEN_MAX。一般来说,每个进程最多可以打开 64 个文件(0 — 63)。对于 FreeBSD 8.0、Linux 3.2.0、Mac OS X 10.6.8 以及 Solaris 10 来说,文件描述符的变化范围几乎是无限的,它只受系统配置的存储器总量、整型的字长以及系统管理员所配置的软限制和硬限制的约束。

OPEN_MAX:每个进程最大打开文件数。查看如下:

查看 man sysconf
PEN_MAX - _SC_OPEN_MAX
              The maximum number of files that a process can have open at any time.  Must not be less than _POSIX_OPEN_MAX (20).
或参看:man sysconf()
#include <unistd.h>
#include <stdio.h>
int main (void)
{
    printf("_SC_ARG_MAX: %ld\\n", sysconf(_SC_ARG_MAX));
    printf("_SC_CHILD_MAX: %ld\\n", sysconf(_SC_CHILD_MAX));
    printf("_SC_CLK_TCK: %ld\\n", sysconf(_SC_CLK_TCK));
    printf("_SC_NGROUPS_MAX: %ld\\n", sysconf(_SC_NGROUPS_MAX));
    printf("_SC_OPEN_MAX: %ld\\n", sysconf(_SC_OPEN_MAX));
    printf("_SC_JOB_CONTROL: %ld\\n", sysconf(_SC_JOB_CONTROL));
    printf("_SC_SAVED_IDS: %ld\\n", sysconf(_SC_SAVED_IDS));
    printf("_SC_VERSION: %ld\\n", sysconf(_SC_VERSION));
	return 0;
}
输出结果:
_SC_ARG_MAX: 2097152
_SC_CHILD_MAX: 7892
_SC_CLK_TCK: 100
_SC_NGROUPS_MAX: 65536
_SC_OPEN_MAX: 1024
_SC_JOB_CONTROL: 1
_SC_SAVED_IDS: 1
_SC_VERSION: 200809
可得,在 Ubuntu 12.04 下测试结果为:_SC_OPEN_MAX =1024 

而在 /apue.3e/exercises/openmax.c 也是有获取系统的 _SC_OPEN_MAX 的程序,可自行查看。

3、最大文件描述符数

通过上面可知,默认的 Linux 进程的最大打开文件描述符数是 1024。但是在某些情况下这点文件描述符数是远远不够的,可根据需要进行更改。

第一种方法:通过 ulimit 命令修改  

参看:ulimit 命令    

以上是关于UNIX再学习 -- 文件I/O的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统学习笔记:文件I/O

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

JAVA I/O文件NIO

APUE---文件I/O

Unix的I/O模型

linux学习笔记 linux下I/O接口的演变之路