返回EINVAL超過256所描述這裏是一個崩潰的示例代碼:民意調查()在MacOS
#include <stdio.h>
#include <poll.h>
#include <stdlib.h>
#include <limits.h>
#define POLL_SIZE 1024
int main(int argc, const char * argv[]) {
printf("%d\n", OPEN_MAX);
struct pollfd *poll_ = calloc(POLL_SIZE, sizeof(struct pollfd));
if (poll(poll_, POLL_SIZE, -1) < 0)
if (errno == EINVAL)
perror("poll error");
return 0;
}
如果設置POLL_SIZE
爲256或更低,代碼工作就好了。有趣的是,如果你在Xcode中運行這個代碼,它會正常執行,但是如果你自己運行這個二進制文件,你會發生崩潰。
輸出是這樣的:
10240
poll error: Invalid argument
根據poll(2)
:
[EINVAL] The nfds argument is greater than OPEN_MAX or the
timeout argument is less than -1.
正如你所看到的,POLL_SIZE
比限制小了很多,並且超時正好是-1,但它墜毀了。
我鐺版本:
Configured with: prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/c++/4.2.1
Apple LLVM version 8.1.0 (clang-802.0.41)
Target: x86_64-apple-darwin16.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
您是否閱讀過[手冊頁](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man2/poll.2.html)?它對「EINVAL」有何評論? OPEN_MAX的價值是什麼? –
另請參見[getrlimit](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man2/getrlimit.2.html) –
實際上,您經常使用'poll'不是太大的一組文件描述符,並且提到了幾次 - 在傳遞給poll的數組中,* same *文件描述符(例如0)是不好的味道。所以在實踐中它並不重要,它肯定是一個系統管理員問題。但是請閱讀[C10K問題](https://en.wikipedia.org/wiki/C10k_problem) –