CC++:文件描述符与进程之间的关系

CC++:文件描述符与进程之间的关系,第1张

进程中一个文件描述符,对应着一个可读或可写的文件或流,每个进程默认会拥有三个文件描述符,分别是0,1,2,对应着标准输入,输出以及错误。当你再进程中打开新的文件或流时,会得到当前最小可用的描述符。

问题一:文件描述符和文件指针的区别 文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。

文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。

问题二:谁能解释一下文件描述符标志? 文件描述符非负整数打现存文件或新建文件内核返文件描述符读写文件需要使用文件描述符指定待读写文件 习惯标准输入(standard input)文件描述符 0标准输(standard output) 1标准错误(standard error) 2尽管种习惯并非 Unix 内核特性些 shell 应用程序都使用种习惯内核遵循种习惯应用程序能使用 POSIX 定义 STDIN_FILENO、STDOUT_FILENO STDERR_FILENO 代替 0、1、2三符号量定义位于文件 unistd.h 文件描述符效范围 0 OPEN_MAX般说每进程打 64 文件(0 ― 63)于 FreeBSD 5.2.1、Mac OS X 10.3 Solaris 9 说每进程打文件少取决于系统内存int 及系统管理员设定限制

问题三:文件描述符的定义数量 如何在不同平台上定义文件描述符的数量文件描述符极限以及可分配给进程的最大大小由资源限制来定义。这些值应当按照在WebLogicServer文档中建议的、特定于 *** 作系统的文件描述符值来设置:对于WLS8.1:调整硬件、 *** 作系统和网络性能对于WLS7.0:调整硬件、 *** 作系统和网络性能对于WLS6.1:调整硬件、 *** 作系统和网络性能Unix和Linux都有文件描述符。不过,二者的主要区别在于如何设置文件描述符的硬极限值、缺省值和配置过程。Solaris/usr/bin/ulimit实用程序定义允许单个进程使用的文件描述符的数量。它的最大值在rlim_fd_max中定义,在缺省情况下,它设置为65,536。只有root用户才能修改这些内核值。Linux管理用户可以在etc/security/limits.conf配置文件中设置他们的文件描述符极限,如下例所示。softnofile1024hardnofile4096系统级文件描述符极限还可以通过将以下三行添加到/etc/rc.d/rc.local启动脚本中来设置:#Increasesystem-widefiledescriptorlimit.echo4096>/proc/sys/fs/file-maxecho16384>/proc/sys/fs/inode-maxWindows在Windows *** 作系统上,文件描述符被称作文件句柄。在Windows2000服务器上,打开文件的句柄极限设置为16,384。此数量可以在任务管理器的性能摘要中监视。HP-UXnfile定义打开文件的最大数量。此值通常由以下公式来确定:((NPROC*2)+1000),其中NPROC通常为:((MAXUSERS*5)+64)。如果MAXUSERS等于400,则经过计算得到此值为5128。通常可以将此值设高一些。maxfiles是每个进程的软文件极限,maxfiles_lim是每个进程的硬文件极限。AIX文件描述符极限在/etc/security/limits文件中设置,它的缺省值是2000。此极限可以通过ulimit命令或setrlimit子例程来更改。最大大小由OPEN_MAX常数来定义。

问题四:文件描述符可以是0吗 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。

第一个打开的文件是0,第二个是1,依此类推。Unix *** 作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix 通常有一个系统级的限制。 os.chinauni

问题五:如何判断文件描述符在fd open 一个文件将返回一个文件描述符。 0 - 返回的文件描述符 就是已经打开的。 /proc/pid/fd 下面为该进程打开的文件描述符 如果我的回答没能帮助您,请继续追问。

问题六:Linux查看进程打开多少文件描述符命令 linux系统下查看进程打开文件在/proc下,对应每个进程有一个以进程号命名的目录,该目录下有一个fd目录,该目录下面的每个文件是一个符号连接,其文件名对应该进程占用的一个文件描述符,而连接指向的内容表示文件描述符对应的实际文件,有多少个文件描述符表示该进程打开了多少文件。

另外Linux

默认的进程打开文件上限是1024个,可以通过ulimit

-n查看。很多系统上限可以通过修改/etc/security/limits.conf文件改变,这个文件有详细的注释,对如何修改做了说明。如果希望

把所有用户的进程打开文件上限改为65536,可以加入下面两行

* soft nofile 65535

* hard nofile 65535

还可以只真对某个用户或某个组做修改,具体方法参见文件注释。修改后需要重新启动系统才能生效。

问题七:linux 文件描述符 3是什么?例如 0 1 2代表标准的输出输入和出错,但是3,4又是什么的呢? 其他已经被打开的文件

问题八:文件描述符挂起是什么意思 具体 *** 作,需要修改两处,并且需重新启动Linux服务器。首先SSH登录服务器,执行ulimit-a查看当前限制。这一步是可选,主要是看下限制,心里有数。第一处修改:vim/etc/security/limits.conf在文件尾部增加:*softnofile65535*hardno

问题九:有人了解java与linux文件描述符之间的关系吗 linux文件描述符? 可以认为是linux下的任务管理中打开文件的索引表,是系统中使用的。。。。。。。java是一个平台、一种编程语言。。。。。。不知道要怎么比较了。

问题十:文件描述符fb和tcp连接数有什么关系 C10K的问题在上个世纪90年代就被提出来了。大概的意思是当用户数超过1万时,很多设计不良好的网络服务程序性能都将急剧下降、甚至瘫痪。并且,这个问题并不能通过升级硬件设备解决,是 *** 作系统固有的问题,也就是说,如果你的服务器最高能支撑1000个并发,尽管你升级了计算能力高一倍的 cpu,内存再翻一番,硬盘转速在快一倍,也无法支撑2000个并发。

经典的网络编程模型有4个:

1. Serve one client with each thread/process, and use blocking I/O。即对每个客户都使用不同的线程或进程进行服务,在每个线程或进程中使用阻塞I/O。这是小程序和java常用的策略,对于交互式的应用也是常见的选择,这种策略很能难满足高性能程序的需求,好处是实现极其简单,容易实现复杂的交互逻辑。我们常用的Apache、ftpd等都是这种工作。

2. Serve many clients with single thread, and use nonblocking I/O and readiness notification。即对所有的客户使用单一一个线程或进程进行服务,在这个线程或进程里,采用异步IO的策略。这是经典模型,优点在于实现较简单,方便移植,也能提供足够的性能;缺点在于无法充分利用多CPU的资源。

3. Serve many clients with each thread, and use nonblocking I/O and readiness notification 对经典模型2的简单改进,仍然采用异步IO的策略,但对所有的客户使用多个线程或进程进行服务。缺点是容易在多线程并发上出bug,甚至某些OS不支持多线程进行readiness notification

4. Serve many clients with each thread, and use asynchronous I/O 在有AI/O支持的OS上,能提供相当高的性能。不过AI/O编程模型和经典模型差别相当大,基本上很难写出一个框架同时支持AI/O和经典模型。这个模型主要是用于window平台上。

在Linux *** 作系统中,可以将一切都看作是文件,包括普通文件,目录文件,字符设备文件(如键盘,鼠标...),块设备文件(如硬盘,光驱...),套接字等等,所有一切均抽象成文件,提供了统一的接口,方便应用程序调用

既然在Linux *** 作系统中,你将一切都抽象为了文件,那么对于一个打开的文件,我应用程序怎么对应上呢?

文件描述符应运而生

文件描述符:简称fd,当应用程序请求内核打开/新建一个文件时,内核会返回一个文件描述符用于对应这个打开/新建的文件,其fd本质上就是一个非负整数,读写文件也是需要使用这个文件描述符来指定待读写的文件的

*** 作系统的核心叫内核,是一个独立的软件

*** 作系统为每一个进程维护了一个文件描述符表,该表的索引值都从从0开始的,所以在不同的进程中可以看到相同的文件描述符,这种情况下相同的文件描述符可能指向同一个文件,也可能指向不同的文件,具体情况需要具体分析,下面用一张简图就可以很容易的明白了

通过上图可以看到,当不同进程中出现相同的文件描述符时,可能实际对应的文件并不是同一个,相反不同进程中不同的文件描述符也可可能对应同一个文件

文件描述符是一个重要的系统资源,理论上系统内存多大就应该可以打开多少个文件描述符,但是实际情况是,内核会有系统级限制,以及用户级限制(不让某一个应用程序进程消耗掉所有的文件资源,可以使用ulimit -n 查看)

进程 + 文件描述符ID确认,因为内核为每个进程都有一份其所属的文件描述符表

应用程序进程拿到的文件描述符ID == 进程文件描述符表的索引,通过索引拿到文件指针,指向系统级文件描述符表的文件偏移量,再通过文件偏移量找到inode指针,最终对应到真实的文件

最后说下套接字,套接字也是文件,当server端监听到有连接时,应用程序会请求内核创建Socket,Socket创建好后会返回一个文件描述符给应用程序,当有数据包过来网卡时,内核会通过数据包的源端口,源ip,目的端口等在内核维护的一个ipcb双向链表中找到对应的Socket,并将数据包赋值到该Socket的缓冲区,应用程序请求读取Socket中的数据时,内核就会将数据拷贝到应用程序的内存空间,从而完成读取Socket数据

这里提一下, *** 作系统针对不同的传输方式(TCP,UDP)会在内核中各自维护一个Socket双向链表,当数据包到达网卡时,会根据数据包的源端口,源ip,目的端口从对应的链表中找到其对应的Socket,并会将数据拷贝到Socket的缓冲区,等待应用程序读取

最后附上Linux中进程结构图


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7937258.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存