2011-12-24 43 views
1

我有一個創建大量套接字(大約700個套接字)的PERL腳本,然後用這些套接字做東西。之後,它使用system(...)命令啓動另一個應用程序,該應用程序可以打開更多的套接字(例如800左右),但由於每個進程的套接字數量限制爲1024,因此我超出了限制,並且沒有從中獲得預期數據插座號碼1024及以上。在子進程中不需要的打開套接字

現在我的問題是這樣的:

  1. 系統是否命令make推出繼承所有打開的文件描述符/套接字的應用程序?
  2. 如果上述問題的答案是肯定的,那麼還有其他一些方法來啓動另一個應用程序,以使啓動的應用程序不會繼承文件描述符嗎?
  3. 如果2.的答案爲否,那麼是否有某種方法可以關閉子進程中的所有繼承的文件描述符?
+0

假設這是一個類UNIX系統,每用戶fd限制是多少? – pilcrow

+0

每個用戶是否有限制?我不知道... 每個進程的限制設置爲1024(所以0到1023工作正常,並且1024失敗)... – mtahmed

+0

我的意思是用戶的進程可能有一個資源限制低於系統。你可以在system()之前打印'$^F'嗎?你可以試試'system('ulimit -n; exec your_command ...')'來查看當前的限制嗎? – pilcrow

回答

3

查看perlvar $^F,它控制哪些文件描述符設置爲執行關閉。當您調用system()時,默認設置應該關閉所有套接字描述符,但如果沒有,可能$^F沒有設置爲您想要的。一個非常快速簡便的方法來告訴Linux系統上的就只是將現有的系統()調用之前有權試試這個電話:

system("ls -l /proc/self/fd"); 

的LS的輸出會告訴你哪些文件被留下當打開「 ls「命令被執行。很可能你會看到只有stdin,stdout和stderr(描述符0,1和2)是打開的,但是如果你看到你的套接字描述符打開,我會嘗試設置$^F = 2,看看是否有幫助。

+0

好的,我會在28日嘗試這個......謝謝 – mtahmed

+0

出於好奇...只是另一個問題......你知道如何關閉在C子進程中打開套接字嗎? – mtahmed

+0

當然,假設你無法弄清楚爲什麼關閉執行不起作用(我認爲仍然是最好的第一種方法),你可以強制一切,但stdin,stdout和stderr這樣關閉:'for(my $ fd = 3; $ fd <1024; $ fd ++){ close(F)if open(F,「<&= $ fd」); } ' – andy

相關問題