2011-04-10 64 views
1

當我使用輪詢功能並將數量設置爲1000以上時,它根本不會睡覺。任何可能的想法。 opengroup沒有提到任何限制,我也沒有接近耗盡我的記憶空間。但是當我檢查指針時,整數是負數。任何想法可能是什麼?C:輪詢功能限制

+2

「poll」的返回值是什麼?如果它是-1,「errno」的價值是什麼? – 2011-04-10 04:52:07

+0

perror(「poll」); = poll:無效的參數 – Jay 2011-04-10 05:01:47

+0

正在尋找從errno.h使用哪些函數,但我無法弄清楚。 – Jay 2011-04-10 05:02:32

回答

1

我的猜測是你的文件描述符的限制設置爲1024.你可以通過在bash中運行ulimit -n(unix)。對於窗戶請參閱http://support.microsoft.com/kb/111855。如果您運行的是Linux,你可以增加通過修改/etc/limits.conf(或/etc/security/limits.conf文件或類似)這樣的限制:

*    soft nofile 10240 
*    hard nofile 10240 

注意,更改後的限制,你將有註銷並重新登錄以獲取新值。

+0

我一直在想這個限制。現在有這個數字的最大值嗎?什麼是依賴關係爲什麼它被默認設置得如此之低? – Jay 2011-04-10 05:05:32

+0

@Jay,您可以爲'nofile' rlimits設置的最大值可以通過'/ proc/sys/fs/file-max'進行控制;請參閱'proc(5)'條目。 – sarnold 2011-04-10 05:12:56

+0

您可以通過許多不同的方式獲得最大值。帶有RLIMIT_NOFILE的getdtablesize()和getrlimit()... 1024開放式fds對於典型的應用程序來說是很多的。對於服務器,您通常知道自己在做什麼,並將此值增加到符合您需要的任何值。 – Gonzalo 2011-04-10 05:16:44

1

如果poll()返回負數,則應使用perror("poll");來顯示原因。

如果原因是 「無效的參數」,也可能是這個原因(從the Linux poll() man page):

EINVAL

NFDs的值超過 RLIMIT_NOFILE值。

順便說一句,在POSIX規範列表這是一個錯誤太:

民調()函數將失敗,如果: ... [EINVAL]nfds參數大於{OPEN_MAX}