2010-03-01 1 views
3

리눅스에서는 프로세스의 rlimit이 fork 또는 exec 후에 그대로 유지됩니다. 하지만 fork 나 exec 후에 자식의 RLIMIT_STACK을 잃어 버립니다. 누군가 좀 설명해 주시겠습니까?

다음은 내 프로그램의 설명적인 출력입니다. 하드 10,485,760 - -Linux에서 fork 또는 exec 후 RLIMIT_STACK이 손실되는 이유는 무엇입니까?

는 // 부모는 부드러운이

RLIMIT_STACK 같은 RLIMIT_STACK을 가지고 -1

, 아이가 포크 후 아이의 RLIMIT_STACK

을 잃게 // 마우스 오른쪽 포크 후

, RLIMIT_STACK, 소프트 - -1, 하드 - -1

//이 아이에서 간부하기 전에, RLIMIT_STACK 소프트가 설정되어

-10485760 다시

RLI MIT_STACK은 확인을 설정합니다. 설정 후 아이에서

, RLIMIT_STACK, 소프트 - 10485760, 하드 - -1 아동 PID는 = 3096

// 간부 후, 새로운 프로세스를 다시

RLIMIT_STACK이있어 그 RLIMIT_STACK을 잃게 소프트 - - 하드 1 - -1 사전에

덕분에

+0

어떤 버전 및 플랫폼입니까? 2.6.23 및 2.6.25에서 RLIMIT_STACK 동작이 변경되었습니다. –

+0

2.6.9-52bs x86_64 SMP – Utoah

+0

앱이 2.4.20-18.7smp i686 플랫폼에서 32 비트 버전으로 컴파일되었습니다. 그리고 위에 게시 된 플랫폼에서 실행되었습니다. 이 상황에서만 문제가 나타납니다. 실행하려는 64 비트 플랫폼에서 컴파일 된 경우이 문제없이 정상적으로 실행되며 컴파일 된 경우 32 비트 플랫폼에서 정상적으로 실행됩니다. – Utoah

답변

1

는이 점 libpthread의 linuxthread 구현의 문제 (나는 그것이 버그가 확실하지 않다)을 보인다.
내가 간단한 프로그램 작성 :

#include <errno.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/resource.h> 
#include <sys/time.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 

int main(int argc, char **argv){ 
struct rlimit resource_limit; 
if(getrlimit(RLIMIT_STACK, &resource_limit) != 0){ 
    fprintf(stderr, "Failed to get rlimit: %s\n", strerror(errno)); 
    return 1; 
} 
else{ 
    fprintf(stderr, "In parent, RLIMIT_STACK, soft-%d, hard-%d\n", 
      resource_limit.rlim_cur, resource_limit.rlim_max); 
} 

int child_status = 0; 
pid_t pid = fork(); 
switch(pid){ 
    case 0://child 
     if(getrlimit(RLIMIT_STACK, &resource_limit) != 0){ 
      fprintf(stderr, "Failed to get rlimit: %s\n", strerror(errno)); 
      return 1; 
     } 
     else{ 
      fprintf(stderr, "In child after fork, RLIMIT_STACK, soft-%d, hard-%d\n", 
        resource_limit.rlim_cur, resource_limit.rlim_max); 
     } 
     break; 
    case -1: 
     fprintf(stderr, "Fork error: %s\n", strerror(errno)); 
     break; 
    default://parent 
     waitpid(pid, &child_status, 0); 
     break; 
} 
return 0; 

}이 프로그램을 컴파일하고 -lpthread 옵션을 사용하지 않고 연결되어 있으면


를, 그것은 확인을 모든 곳에서 실행됩니다. 이 -lpthread 옵션과 연결되어 때, 유선 일이 일어날 :

In parent, RLIMIT_STACK, soft-10485760, hard--1 
In child after fork, RLIMIT_STACK, soft--1, hard--1 

을하지만 기계 위치에 실행하면 그것은 동적 점 libpthread의 linuxthread 버전에 연결된 컴퓨터에서 실행되는 경우가 있습니다 libpthread의 NPTL 버전에 동적으로 링크되어 있으므로 예상 결과를 얻을 수 있습니다.

In parent, RLIMIT_STACK, soft-10485760, hard--1 
In child after fork, RLIMIT_STACK, soft-10485760, hard--1