2017-03-11 36 views
0

如果我看看使用launchctllimit命令maxfiles選項(我的OS X酋長機)設置maxfile的MacOS編程

$ launchctl limit 
    cpu   unlimited  unlimited  
    filesize unlimited  unlimited  
    data  unlimited  unlimited  
    stack  8388608  67104768  
    core  0    unlimited  
    rss   unlimited  unlimited  
    memlock  unlimited  unlimited  
    maxproc  709   1064   
    maxfiles 256   unlimited 

似乎有256個軟限制,和「無限」的硬限制。我想將軟限制更改爲2048之類的值,並保持硬限制不變。當我看到limit的論點

$ launchctl help limit 
Usage: launchctl limit [<limit-name> [<both-limits> | <soft-limit> <hard-limit>] 

看來我可以同時設置限制,以同樣的事情,設定值軟,硬。但是,如果我試圖設置無限的硬限制。

$ sudo launchctl limit maxfiles 2048 unlimited 

我最終的10240

$ launchctl limit 
    cpu   unlimited  unlimited  
    filesize unlimited  unlimited  
    data  unlimited  unlimited  
    stack  8388608  67104768  
    core  0    unlimited  
    rss   unlimited  unlimited  
    memlock  unlimited  unlimited  
    maxproc  709   1064   
    maxfiles 2048   10240   

好奇的價值這是怎麼回事?是否可以設置無限值?如果沒有,那麼launchctl limit命令的限制,還是系統級別的限制?如果以後,那麼報告的初始值是多少?還是這個蘋果是蘋果?

加分 - 沒有人知道爲什麼這個限制是在第一個地方設置這麼低?

+0

爲什麼主題使用單詞「編程」?你在這裏展示的不是以傳統意義上的程序設置限制(即通過在你自己的程序中調用系統API)。您正在調用「外部」工具。因此,它與無題主題接近,應該可能是超級用戶或不同的問題。 –

+0

@KenThomases這個問題歸結爲它的本質,我的實際上下文是使用這些命令作爲我編程的shell腳本的一部分,我也對底層系統調用感興趣。即我沒有承諾在我的程序中使用launchctl,它現在只是最方便的機制。沒有任何爭論,說它是邊緣化的,但我所有的SE參與年讓我覺得它在邊界的邊上,讓它留下:) –

回答

2

man page for setrlimit(),底層系統調用launchd將靠什麼來實現此功能:

setrlimit()現在errno設置爲EINVAL返回,在歷史上成功的地方。它不再接受RLIM_NOFILE的「rlim_cur = RLIM_INFINITY」。使用「rlim_cur = min(OPEN_MAX, rlim_max)」。

所以,雖然getrlimit()可能(最初)報告中指出,硬限制是RLIM_INFINITY,它是,實際上,OPEN_MAX(10240),因爲這是簡單地由內核是如何實現施加的限制。如果您嘗試設置限制,則需要使用後一個值,這會影響到此後報告的內容。

至於爲什麼RLIM_NOFILE默認爲256軟限制,這是因爲對於廣闊,絕大部分的過程,這不是一個實際的約束。他們相處得很好,沒有接近這個極限。並保持價值「如此之低」意味着每個進程都有在內存方面成本較低,每fork()少的工作要做複製文件描述符到新的子進程,等等。

知道他們可能使用更多文件的程序可以使用setrlimit()更改自己的限制。

1

沒有猜測,爲什麼,蘋果在優勝美地改變了這些。只有通過launchctl限制進行的任何更改纔是您當前登錄的臨時設置。重新編程或重新啓動,他們會馬上回到Apple設置的默認值。

我可以證實他們沒有改變這種行爲又爲10.12.4 B4的。當它的蘋果是蘋果

不過癮消化。我在開發人員文檔中做了深入的研究,並且找不到解釋爲什麼他們會做出這樣的改變。