文件描述符标志?
文件描述符是 Unix 系统内核中用于表示特定进程打开的特定文件的方式,通常是一个 int 类型的变量。当进程打开一个文件的时候,内核生成一个文件描述符,传递给调用进程;当进程需要操作这个文件的时候只要向内核传递这个描述符,内核就可以找到对应的文件执行响应操作
1. 文件描述符
对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。
按照惯例,UNIX系统shell使用文件描述符0与进程的标准输入相关联,文件描述符1与标准输出相关联,文件描述符2与标准出错输出相关联。这是各种shell以及很多应用程序使用的惯例,而与UNIX内核无关。尽管如此,如果不遵照这种惯例,那么很多UNIX系统应用程序就不能正常工作。
在依从POSIX的应用程序中,幻数0、1、2应当替换成符号常量STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。这些常量都定义在头文件<unistd.h>中。
文件描述符的变化范围是0~OPEN_MAX(见表2-10)。早期的UNIX系统实现采用的上限值是19(允许每个进程最多打开20个文件),但现在很多系统则将其增至63。
对于FreeBSD 5.2.1、Mac OS X 10.3以及Solaris 9,文件描述符的变化范围实际上是无限的,它只受到系统配置的存储器总量、整型的字长以及系统管理员所配置的软限制和硬限制的约束。Linux2.4.22对于每个进程的文件描述符数的硬限制是1 048 576。
因为squid 的工作方式,文件描述符的限制可能会极大的影响性能。当squid 用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。直到一部分当前请求完成,相应的文件和socket 被关闭,squid 不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。
在运行./configure 之前,检查你的系统的文件描述符限制是否合适,能给你避免一些麻烦。大多数情况下,1024 个文件描述符足够了。非常忙的cache可能需要4096或更多。在配置文件描述符限制时,我推荐设置系统级限制的数量为每个进程限制的2 倍。
2、怎么突破,具体方法?
先查看LINUX默认的文件描述符:
# ulimit -n
1024
我们用命令
ulimit -HSn 65536
来增大文件描述符,然后编译安装squid,
把ulimit -HSn 65536放到/etc/rc.d/rc.local让启动时加载。
以下为转载:
Linux
在Linux 上配置文件描述符有点复杂。在编译squid 之前,你必须编辑系统include
文件中的一个,然后执行一些shell 命令。请首先编辑/usr/include/bits/types.h 文件,改变__FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192
下一步,使用这个命令增加内核文件描述符的限制:
# echo 8192 >; /proc/sys/fs/file-max
最后,增加进程文件描述符的限制,在你即将编译squid 的同一个shell 里执行:
sh# ulimit -Hn 8192
该命令必须以root 运行,仅仅运行在bash shell。不必重启机器。
使用这个技术,你必须在每一次系统启动后执行上述echo 和ulimit 命令,或者至少在squid 启动之前。假如你使用某个rc.d 脚本来启动squid,那是一个放置这些命令的好地方。
分享到:
相关推荐
用来操作文件描述符的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令用来操作文件描述符的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令用来操作文件描述符的一些特性。参数...
文档介绍了一)概述,二)父/子进程对文件描述符的分支使用示例,三)文件描述符与/proc,四)文件描述符与lsof命令,五)文件描述符的限制
fcntl函数复制文件描述符,此例只是用来留作笔记,
自己二次开发的代码,简单易用,一共330行。 基本思路:2个单独的进程:send 和 recv。其中send进程打开554端口监听fd,然后将它发送给recv进程,然后自己关闭。recv进程接收fd后,执行select监听,直到接收到554端口...
1.描述: 2.系统为维护文件描述符,建立了三个表 3.通过这三个表,认识文件描述符 2.进程A和进程B打开了同一个文件,且文件描述 3.A、B中某个进程通过U
①编写Java文件 ②使用javac将.java编译成.class文件,然后使用javah编译相应的头文件 ③实现相关的.c/.cpp文件(实现头文件中定义的函数) ④编写Android.mk和Aplication.mk文件 ⑤利用ndk编译so库。
对紧凑型二进制文件描述符的高效有区别预测
TeenyDT_USB描述符生成工具,支持命令行和图形化工具生成描述符和端点初始化代码,支持图形化工具生成驱动inf文件并签名
SQUID默认文件描述符为:2048往往访问量比较大时就会出现文件描述符不足的错误. 本下载经过海豹同学的重新编绎,把文件描述符修改为20480.大家下载后直接用就好了. 如需自已重新编绎,请查看博客:hi.baidu.com/jiahai
android传递大文件的话,第一想到的就是匿名共享内存了,但是进程间怎么共享匿名共享内存的。试想进程A创建匿名共享内存,进程B怎么得共享内存读出数据?熬得凌晨2点多写个demo,备忘和分享!
问题过去有段时间了,忘记当时怎么想到是超过文件描述符限制了。大概是根据句柄的值或者返回的错误码了。 嗯。linux下文件描述符最大限制默认最大为1024,通过 [root@localhost ~]# ulimit -n 1024 这个命令可以...
fd:文件描述符 Swift文件描述符库。 fd是基础系统文件描述符和套接字API之上的最小层。 用法 FileDescriptor FileDescriptor是包含单个属性(fileNumber)的协议。 protocol FileDescriptor { var fileNumber: ...
Linux内核中的文件描述符.docx
Linux将所有内核对象当做文件来处理,系统用一个size_t类型来表示一个文件对象,比如对于文件描述符0就表示系统的标准输入设备STDIN,通常情况下STDIN的值为键盘,如read命令就默认从STDIN读取数据,当然STDIN的值是...
通过文件描述符恢复被误删除的文件(前提是文件正被某一个进程占用着,未被释放)
基于linux ,使用select检测串口句柄事件,同时进行超时判断的串口485读写操作。为高效可控的linux串口操作例程。tcsetattr,tcflush,select,ioctl,gettimeofday。485收发方向切换。
通常我们通过终端连接到linux系统后执行ulimit -n 命令可以看到本次登录的session其文件描述符的限制,如下: $ulimit -n 1024 当然可以通过ulimit -SHn 102400 命令来修改该限制,但这个变更只对当前的...
进程文件描述符(pidfd)提供了一种无竞争的方式来管理Linux上的进程,使用文件描述符而不是在进程退出后可以重用的数字进程ID(PID)来维护对进程的持久引用。 Linux的进程文件描述符(pidfd)提供了一种无竞争的...
Linux中通过Socket文件描述符寻找连接状态介绍.docx
经过几天对UNIX域套接字传送文件描述符的学习,根据自己的认识对网络和书本上的知识进行了简单的整理,希望能帮到大家,让新手们比我少走些弯路。