我的代码打开超过256个文件句柄,所以当我在solaris机器上运行它时,我最终会出现“超出文件处理程序限制”错误。
我对此有两个问题
1)此限制仅适用于32位软件,或者64位软件也受此限制。我用Google搜索并了解64位软件没有这个限制。(http://developers.sun.com/solaris/articles/stdio_256.html) 但我构建了64位静态对象,当我使用它时,它给出了错误。实际上64位软件意味着什么?
2)如上面的链接所示,我使用ulimit来增加文件处理程序限制(在运行时,我的意思是在运行命令之前),导出的extendedFile库,我没有得到任何错误。我们要做什么加入Linux?
由于 D. L. Kumar
答案 0 :(得分:3)
我之前遇到过这个。据我所知,这实际上是solaris的libc中的一个错误,它使用8位无符号整数类型将fd存储在FILE结构中。显然,他们没有以向后兼容的名义快速更改它(如果程序由于某种原因依赖于FILE结构的实现细节)。这应该 NOT 是Linux或任何其他非solaris * nix的问题。您引用的文章提出了合理的解决方法,因此您应该使用这些。
对于“什么是64位可执行文件”,它只是一个为64位指令集编译的二进制文件。有些架构支持一些不支持。 (例如,x86-64操作系统通常允许32位进程以实现向后兼容)。
答案 1 :(得分:1)
要检查目标文件(可执行文件)是否为64位,请使用file命令(至少在Linux上)。
例如:
$ file `which ls`
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped
$ file my-32bit-exe
my-32bit-exe: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), corrupted section header size
(不介意“损坏的部分标题大小” - exe被手动修改以减少文件大小。)
答案 2 :(得分:1)
在Solaris上,您可以使用以下任一方法构建64位程序:
cc -xarch=v9 ...
或者:
gcc -m64 ...
正如Evan所说,32位Solaris的基本问题是向后二进制兼容性和用于保存fd的8位整数。
我刚在Solaris 10 for SPARC上试过这段代码:
#include <stdio.h>
int main(void)
{
size_t i;
for (i = 0; i < 300; i++)
{
FILE *fp = fopen("/dev/null", "a");
if (fp == 0)
{
printf("Failed on %zu\n", i);
return(1);
}
}
printf("Succeeded to %zu\n", i);
return(0);
}
编译为:
cc -xarch=v9 -o xxx xxx.c
它给了我'253失败'。 (这是测试代码:我知道它会抛出252个指针。)这支持你对一个简单的64位构建的争论。然而,还有另一个因素 - 资源限制。
$ ulimit -n
256
$
所以,增加默认限制:
$ ulimit -n 400
$ ulimit -n
400
$ ./xxx
Succeeded to 300
$
试试......
答案 3 :(得分:0)
就像Evan Teran提到的那样,solaris libc对FILE有一个“奇怪”的限制,它只能处理256以下的文件句柄。
这与您可以使用ulimit设置的限制无关。 您可以使用以下程序设置此限制:
#include <sys/resource.h>
struct rlimit rl;
getrlimit(RLIMIT_NOFILE,&rl);
rl.rlim_cur = 1024; /* change it to 1024 - note has to be < than rl.rlim_max */
setrlimit(RLIMIT_NOFILE,&rl);
现在,我也会停止使用FILE *并使用open而不是fopen等。 对于你真正需要使用FILE *的情况,在我工作的几个项目中,在程序开始时,通过执行套接字调用“保留”了几个文件描述符,并且我们有一个小库来获取FILE *这些,通过关闭其中一个插座,然后在做一个fopen之后,将使用刚关闭的fd。当然,还需要使用一个特殊的函数来关闭FILE *,这个函数会关闭然后使用套接字立即获取fd; - )
答案 4 :(得分:0)
最后我得到了解决方案。我在代码中进行了两处更改以使其正常工作
1)如上所述njsf
2)打开带有“F”标志的文件,如下所示 FILE * fp = fopen(“/ dev / null”,“wF”);
非常感谢。 D. L. Kumar