下面的語句的情況並不少見(這是從MIMEDefang的C部分,採取):
/* Number of file descriptors to close when forking */
#define CLOSEFDS 256
...
static void
closefiles(void)
{
int i;
for (i=0; i<CLOSEFDS; i++) {
(void) close(i);
}
}
它是一個黑客的東西(如MIMEDefang代碼諱言)。在許多情況下這是更加有用在FD 3(或STDERR_FILENO+1
)開始而不是0 close()
返回EBADF
具有無效FD,但是這通常不存在問題(至少不是在C,在其他語言的可能會引發異常)。
由於可以判斷文件描述符上限與getrlimit(RLIMIT_NOFILE,...)
這是defined爲:
RLIMIT_NOFILE
這是比最大值大的頭號,該系統可以分配給新創建的描述符。如果超出此限制,則分配文件描述符的函數將失敗,並將errno設置爲[EMFILE]。此限制限制了進程可能分配的文件描述符的數量。
您可以使用此(減1)作爲循環的上限。 以上和ulimit -n
,getconf OPEN_MAX
和sysconf(OPEN_MAX)
應該都是同意的。
由於open()
總是分配最低的空閒FD,所以打開的文件的最大數量和最高的FD + 1是相同的數字。
該守護任意進程的libslack daemon
utility也使用這種方法(同時確保在inetd
下使用前三個描述符時保持打開狀態)。
在您的程序可以跟蹤文件句柄的情況下,最好這樣做,或者在可用的情況下使用FD_CLOEXEC
。然而,如果你想防守編碼,你可能更喜歡不信任你的父進程,比如當啓動由瀏覽器啓動的外部處理程序/查看器進程時,比如說。像Unix上的這個
12
15 year old Mozilla bug一樣。
對於偏執狂(你希望自己的PDF閱讀器,以繼承每個打開的Firefox FD包括緩存,然後打開的TCP連接):
#!/bin/bash
# you might want to use the value of "ulimit -n" instead of picking 255
for ((fd=3; fd<=255; fd++)); do
exec {fd}<&- # close
done
exec /usr/local/bin/xpdf "[email protected]"
*「如果父進程已分配10個文件描述符... 「*:」分配「對你來說意味着什麼?因爲文件描述符是打開或關閉的。單詞分配與內存管理相關聯... – thkala 2013-03-07 09:12:00
更正:我打算說10父進程的打開文件描述符,感謝您的糾正thkala – learner 2013-03-07 10:19:51