文件处理程序的限制交叉256

时间:2008-11-23 03:49:59

标签: file limit handle

我的代码打开超过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

5 个答案:

答案 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被手动修改以减少文件大小。)

ulimit可以在Linux上使用(请参阅ulimit(1)ulimit(3))。

答案 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