このSOの質問と特にこの回答に続いて、printfの後にsetrlimitを呼び出すと機能しないようです。
コード例は次のとおりです。
#include <stdio.h>
#include <sys/resource.h>
int main()
{
struct rlimit rlp;
FILE *fp[10000];
int i;
printf("Hello\n");
rlp.rlim_cur = 10000;
rlp.rlim_max = RLIM_INFINITY;
setrlimit(RLIMIT_NOFILE, &rlp);
getrlimit(RLIMIT_NOFILE, &rlp);
printf("limit %lld %lld\n", rlp.rlim_cur, rlp.rlim_max);
for(i=0;i<10000;i++) {
fp[i] = fopen("a.out", "r");
if(fp[i]==0) { printf("failed after %d\n", i); break; }
}
}
コンソール出力は次のとおりです。
Hello
limit 10000 9223372036854775807
failed after 4861
最初の にコメントするprintf
と、コンソール出力は次のようになります。
limit 10000 9223372036854775807
failed after 9967
その理由はありますか?
[編集] Xcode 4.6.2 で MAC OS X 10.7.5 を実行しています。