File 文件处理程序';s极限交叉点256

File 文件处理程序';s极限交叉点256,file,limit,handle,File,Limit,Handle,我的代码可以打开超过256个文件句柄,所以当我在solaris机器上运行它时,我最终会出现“超出文件句柄限制”错误 关于这一点,我有两个问题 1) 这个限制只适用于32位软件,或者64位软件也会受到限制。我在谷歌上搜索了一下,发现64位软件没有这个限制 但我构建了64位静态对象,当我使用它时,它给出了错误。64位软件实际上意味着什么 2) 正如上面的链接所示,我使用ulimit增加了文件处理程序的限制(在运行时,我的意思是在运行命令之前),导出了extendedFile库,我没有得到任何错误 谢

我的代码可以打开超过256个文件句柄,所以当我在solaris机器上运行它时,我最终会出现“超出文件句柄限制”错误

关于这一点,我有两个问题

1) 这个限制只适用于32位软件,或者64位软件也会受到限制。我在谷歌上搜索了一下,发现64位软件没有这个限制 但我构建了64位静态对象,当我使用它时,它给出了错误。64位软件实际上意味着什么

2) 正如上面的链接所示,我使用ulimit增加了文件处理程序的限制(在运行时,我的意思是在运行命令之前),导出了extendedFile库,我没有得到任何错误

谢谢
D.L.Kumar要检查对象文件(可执行文件)是否为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上使用(请参阅和)。

我以前遇到过这种情况。据我所知,这实际上是solaris的libc中的一个bug,在这里,他们使用8位无符号整数类型将fd存储在文件结构中。显然,他们没有以向后兼容性的名义很快地更改它(以防程序由于某种原因依赖于文件结构的实现细节)。这在Linux或任何其他非solaris*nix上都不应该是一个问题。您引用的文章建议了合理的解决方法,因此您应该使用这些方法


至于“什么是64位可执行文件”,它只是一个为64位指令集编译的二进制文件。有些体系结构支持两者,有些则不支持。(例如,x86-64操作系统通常允许32位进程向后兼容)。

在Solaris上,您可以使用以下任一方式构建64位程序:

cc -xarch=v9 ...
或:

正如Evan所说,32位Solaris的基本问题是向后二进制兼容性和用于保存fd的8位整数

我刚刚在Solaris 10上为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);
}
它给了我“253失败”。(这是测试代码:我知道它丢弃了252个指针。)这支持了您的论点,即简单的64位构建。然而,还有另一个因素在起作用——资源限制

$ ulimit -n
256
$
因此,通过以下方式增加默认限制:

$ ulimit -n 400
$ ulimit -n
400
$ ./xxx
Succeeded to 300
$

尝试一下…

就像Evan Teran提到的那样,solaris libc对文件有一个“奇怪”的限制,它只能处理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);
#包括
结构rlimit-rl;
getrlimit(RLIMIT_NOFILE,&rl);
rl.rlim_cur=1024;/*将其更改为1024-注释必须小于rl.rlim_max*/
setrlimit(RLIMIT_NOFILE,&rl);
现在,我也会停止使用FILE*并使用open代替fopen,等等。
对于那些你真的,真的需要使用FILE*的情况,在我工作过的几个项目中,在程序开始时,几个文件描述符通过一个套接字调用被“保留”,我们有一个小的库来获取一个文件*使用这些,通过关闭一个套接字,然后马上做一个fopen,它将使用刚刚关闭的fd。当然,还需要使用一个特殊函数关闭文件*,该函数将fclose,然后使用socket立即获取fd;-)

我终于找到了解决办法。我在我的代码中做了两个更改以使其正常工作

1) 如njsf所述

2) 使用“F”标志打开文件,如下所示 文件*fp=fopen(“/dev/null”,“wF”)

非常感谢。
D.L.Kumar

为什么要打开256个文件句柄?!?我不记得有什么应用程序了。永远需要这样做!不幸的是,我的文件组织是这样的,所以有时我需要打开256个以上的文件。
$ ulimit -n 400
$ ulimit -n
400
$ ./xxx
Succeeded to 300
$
#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);