2013-07-18 2 views
0

특히 SO questionthis answer 다음에 printf 다음에 setrlimit를 호출하면 작동하지 않게되는 것 같습니다.printf가 setrlimit을 작동하지 않게합니다.

limit 10000 9223372036854775807 
failed after 9967 

: 내가 처음 printf을 언급하는 경우

Hello 
limit 10000 9223372036854775807 
failed after 4861 

가 여기에 콘솔 출력입니다 : 여기

#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; } 
    } 

} 

콘솔 출력 : 여기에

은 예제 코드 거기에 어떤 이유가 있습니까?

[편집] Xcode 4.6.2를 사용하여 MAc OS X 10.7.5를 실행하고 있습니다.

+0

1. 코드가 출력과 일치하지 않습니다. 2. 방금 Red Hat 5 시스템에서이 시스템을 시험해 보았습니다. "Hello"의 유무와 상관없이 동일한 번호를 받았습니다. 나는 또한 그것이 당신의 시스템에서 어떤 일이 일어나고 있는지에 달려 있다고 믿습니다. – BoBTFish

+0

이것은 내가 사용하고있는 정확한 코드입니다. MacOS 10.7에서 Xcode 4.6.2를 사용하고 있습니다. –

+0

정말요? ** 정확한 ** 코드는'printf ("after ...")'를 포함하고 있지만 "limit ..."'를 출력합니까? 당신의'printf' 구현은 심각하게 깨졌습니다 !! – BoBTFish

답변

1

다음은 더 많은 문제를 보여주는 프로그램의 더 나은 버전입니다. 변경 한 "# 만약 1"이 프로그램을 실행하면 예상대로

#include <stdio.h> 
#include <sys/resource.h> 
#include <err.h> 
#include <fcntl.h> 

int 
main(int argc, char **argv) 
{ 
     struct rlimit rl; 
     int i; 

     rl.rlim_cur = 10; 
     rl.rlim_max = RLIM_INFINITY; 
     if (setrlimit(RLIMIT_NOFILE, &rl)) 
       err(1, "setrlimit"); 

     printf("Hello\n"); 

     rl.rlim_cur = 100; 
     rl.rlim_max = RLIM_INFINITY; 
     if (setrlimit(RLIMIT_NOFILE, &rl)) 
       err(1, "setrlimit"); 

     if (getrlimit(RLIMIT_NOFILE, &rl)) 
       err(1, "getrlimit"); 
     printf("limit %lld\n", rl.rlim_cur); 

     for(i = 0; i < 10000; i++) { 
       FILE *fp; 
#if 1 
       if ((fp = fopen("foo", "r")) == NULL) { 
         err(1, "failed after %d", i); 
       } 
#else 
       if (open("foo", O_RDONLY) == -1) { 
         err(1, "failed after %d", i); 
       } 
#endif 
     } 
     return 0; 
} 

는 "0 #IF"그것은 작동합니다. MacOS는 libc의 stdio를 초기화하는 동안 열린 파일에 대한 제한을 한 번 읽으며 나중에 다시 읽지 않습니다. printf에 대한 첫 번째 호출은 libc의 stdio를 초기화하고 rlimit 값이 열린 파일의 수에 상관없이 캐시합니다. A는 사소한 "안녕하세요, 세상은"표시에 dtruss 실행

는 :

$ cat > hw.c 
#include <stdio.h> 
int main() { printf("hello, world\n"); return 0; } 
$ cc -Wall -o hw hw.c && sudo dtruss ./hw 2>&1 | grep rlimit 
getrlimit(0x1008, 0x7FFF58875AE8, 0x7FFF8BE92470)  = 0 0 
$ 

이 발생하는 사실에 있음을 보여주고있다.

이것은 Apple과 함께해야하는 것으로, 버그와 같은 냄새가납니다.

관련 문제