对于Linux系统而言,所有对设备或文件的操作都是通过文件描述符进行的。
当打开或创建一个文件的时候,内核就向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关进程打开文件的信息。
当一个进程启动时,默认打开了3个文件,标准输入、 标准输出、标准错误,对应的文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO)这些变量定义在unistd.h头文件中。这是低级I/O(通常也称为不带缓冲的I/O,通过系统调用来实现,数据类型是int),相对应的高级I/O是(ANSI C函数提供的标准I/O库称为高级I/O,通常也称为带缓冲的I/O,数据类型是FILE* fp即文件指针)分别是标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应。因此,函数scanf()使用stdin,函数printf()使用stdout。
文件描述符与文件指针转换:
fileno:将文件指针转换为文件描述符
fdopen:将文件描述符转换为文件指针
//============================================================================
// Name : Demo1.cpp
// Author : zfs
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <stdio.h>
int main() {
cout << "file pointer to file descriptor" << endl; //
printf("stdin to file descriptor:%d\n",fileno(stdin));
printf("stdout to filedescriptor:%d\n",fileno(stdout));
printf("stderr to filedescriptor:%d\n",fileno(stderr));
return 0;
}
输出结果:
file pointer to file descriptor
stdin to file descriptor:0
stdout to filedescriptor:1
stderr to filedescriptor:2
1、首先说什么是文件描述符,它有什么作用?
文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix 操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix 通常有一个系统级的限制。
因为squid 的工作方式,文件描述符的限制可能会极大的影响性能。当squid 用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。直到一部分当前请求完成,相应的文件和socket 被关闭,squid 不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。
在运行./configure 之前,检查你的系统的文件描述符限制是否合适,能给你避免一些麻烦。大多数情况下,1024 个文件描述符足够了。非常忙的cache可能需要4096或更多。在配置文件描述符限制时,我推荐设置系统级限制的数量为每个进程限制的2 倍。
2、怎么突破,具体方法?
先查看LINUX默认的文件描述符:
# ulimit -n
1024