Linux中的文件描述符

            对于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值