2023年12月6日發(fā)(作者:太極內(nèi)功心法)

文件描述符1
當(dāng)某個(gè)程序打開(kāi) 文件時(shí), 操作系統(tǒng)返回相應(yīng)的文件描述符,程序?yàn)榱颂幚碓撐募仨氁么嗣枋龇K^的文件描述符是一個(gè)低級(jí)的正整
數(shù)。最前面的三個(gè)文件描述符(0,1,2)分別與標(biāo)準(zhǔn)輸入(stdin),標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯(cuò)誤(stderr)對(duì)應(yīng)。因此,函數(shù)
scanf() 使用 stdin,而函數(shù) printf() 使用 stdout。你可以用不同的文件描述符改寫默認(rèn)的設(shè)置并重定向進(jìn)程的 I/O 到不同的文件。
1、首先說(shuō)什么是文件描述符,它有什么作用?
文件描述符是一個(gè)簡(jiǎn)單的整數(shù),用以標(biāo)明每一個(gè)被進(jìn)程所打開(kāi)的文件和socket。第一個(gè)打開(kāi)的文件是0,第二個(gè)是1,依此類推。Unix 操作
系統(tǒng)通常給每個(gè)進(jìn)程能打開(kāi)的文件數(shù)量強(qiáng)加一個(gè)限制。更甚的是, unix 通常有一個(gè)系統(tǒng)級(jí)的限制。
因?yàn)閟quid 的工作方式,文件描述符的限制可能會(huì)極大的影響性能。當(dāng)squid 用完所有的文件描述符后,它不能接收 用戶新的連接。也就
是說(shuō),用完文件描述符導(dǎo)致拒絕服務(wù)。直到一部分當(dāng)前請(qǐng)求完成,相應(yīng)的文件和socket 被關(guān)閉,squid 不能接收新請(qǐng)求。當(dāng)squid發(fā)現(xiàn)文件
描述符短缺時(shí),它會(huì)發(fā)布警告。
在運(yùn)行./configure 之前,檢查你的系統(tǒng)的文件描述符限制是否合適,能給你避免一些麻煩。大多數(shù)情況下,1024 個(gè)文件描述符足夠了。
非常忙的cache可能需要4096或更多。在配置文件描述符限制時(shí),我推薦設(shè)置系統(tǒng)級(jí)限制的數(shù)量為每個(gè)進(jìn)程限制的2 倍。
2、怎么突破,具體方法?
先查看LINUX默認(rèn)的文件描述符:
# ulimit -n
1024
我們用命令
ulimit -HSn 65536
來(lái)增大文件描述符,然后編譯安裝squid,
把ulimit -HSn 65536放到/etc/rc.d/讓啟動(dòng)時(shí)加載。
以下為轉(zhuǎn)載:
Linux
在Linux 上配置文件描述符有點(diǎn)復(fù)雜。在編譯squid 之前,你必須編輯系統(tǒng)include 文件中的一個(gè),然后執(zhí)行一些 shell 命令。請(qǐng)首先編
輯/usr/include/bits/types.h 文件,改變__FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192
下一步,使用這個(gè)命令增加 內(nèi)核文件描述符的限制:
# echo 8192 >; /proc/sys/fs/file-max
最后,增加進(jìn)程文件描述符的限制,在你即將編譯squid 的同一個(gè)shell 里執(zhí)行:
sh# ulimit -Hn 8192
該命令必須以root 運(yùn)行,僅僅運(yùn)行在bash shell。不必重啟機(jī)器。
使用這個(gè) 技術(shù),你必須在每一次系統(tǒng)啟動(dòng)后執(zhí)行上述echo 和ulimit 命令,或者至少在squid 啟動(dòng)之前。假如你使用某個(gè)rc.d 腳本來(lái)啟動(dòng)
squid,那是一個(gè)放置這些命令的好地方。
補(bǔ)充:
[url= javascript:;] 文件描述符[/url]
是個(gè)很小的正整數(shù),它是一個(gè)索引值,指向內(nèi)核為每一個(gè)進(jìn)程所維護(hù)的該進(jìn)程打開(kāi)文件的記錄表。
文件描述符的優(yōu)點(diǎn):兼容POSIX標(biāo)準(zhǔn),許多
[url= javascript:;] Linux[/url]
和
[url=javascript:;] UNIX[/url]
系統(tǒng)調(diào)用都依賴于它。
文件描述符的缺點(diǎn):不能移植到UNIX以外的系統(tǒng)上去,也不直觀。
基于文件描述符的輸入輸出函數(shù):
open:打開(kāi)一個(gè)文件,并指定訪問(wèn)該文件的方式,調(diào)用成功后返回一個(gè)文件描述符。
creat:打開(kāi)一個(gè)文件,如果該文件不存在,則創(chuàng)建它,調(diào)用成功后返回一個(gè)文件描述符。
clo:關(guān)閉文件,進(jìn)程對(duì)文件所加的鎖全都被釋放。
read:從文件描述符對(duì)應(yīng)的文件中讀取數(shù)據(jù),調(diào)用成功后返回讀出的字節(jié)數(shù)。
write:向文件描述符對(duì)應(yīng)的文件中寫入數(shù)據(jù),調(diào)用成功后返回寫入的字節(jié)數(shù)。
ftruncate:把文件描述符對(duì)應(yīng)的文件縮短到指定的長(zhǎng)度,調(diào)用成功后返回0。
lek:在文件描述符對(duì)應(yīng)的文件里把文件指針設(shè)定到指定的位置,調(diào)用成功后返回新指針的位置。
fsync:將所有已寫入文件中的數(shù)據(jù)真正寫到磁盤或其他下層設(shè)備上,調(diào)用成功后返回0。
fstat:返回文件描述符對(duì)應(yīng)的文件的相關(guān)信息,把結(jié)果保存在struct stat中,調(diào)用成功后返回0。
fchown:改變與打開(kāi)文件相關(guān)聯(lián)的所有者和所有組,調(diào)用成功后返回0。
fchmod:把文件描述符對(duì)應(yīng)的文件的權(quán)限位改為指定的八進(jìn)制模式,調(diào)用成功后返回0。
flock:用于向文件描述符對(duì)應(yīng)的文件施加建議性鎖,調(diào)用成功后返回0。 fcntl:既能施加建議性鎖也能施加強(qiáng)制性鎖,能建立記錄鎖、讀取鎖和寫入鎖,調(diào)用成功后返回0。
dup:復(fù)制文件描述符,返回沒(méi)使用的文件描述符中最小的編號(hào)。
dup2:由用戶指定返回的文件描述符的值,用來(lái)重新打開(kāi)或重定向一個(gè)文件描述符。
lect:同時(shí)從多個(gè)文件描述符讀取數(shù)據(jù)或向多個(gè)文件描述符寫入數(shù)據(jù)。
本文發(fā)布于:2023-12-06 14:22:17,感謝您對(duì)本站的認(rèn)可!
本文鏈接:http://www.newhan.cn/zhishi/a/1701843737112861.html
版權(quán)聲明:本站內(nèi)容均來(lái)自互聯(lián)網(wǎng),僅供演示用,請(qǐng)勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。
本文word下載地址:文件描述符1.doc
本文 PDF 下載地址:文件描述符1.pdf
| 留言與評(píng)論(共有 0 條評(píng)論) |