2011-12-24 2 views
1

많은 소켓 (약 700 개 소켓)을 생성하는 PERL 스크립트가 있으며 그 소켓을 사용합니다. 그 후, system(...) 명령을 사용하여 더 많은 소켓 (예 : 800 정도)을 여는 다른 응용 프로그램을 실행하지만 프로세스 당 소켓 수의 한계가 1024이기 때문에 제한을 초과하고에서 예상 된 데이터를 얻지 못합니다. 소켓 번호는 1024 이상입니다.자식 프로세스의 원치 않는 오픈 소켓

지금 내 질문은 이것이다 :

  1. 시스템 명령이 상속이 열려있는 모든 파일 디스크립터/소켓 시작 응용 프로그램을합니까?
  2. 위의 질문에 대한 대답이 예인 경우 다른 응용 프로그램을 시작하여 시작된 응용 프로그램이 파일 설명자를 상속받지 못하게하는 다른 방법이 있습니까?
  3. 2. 대답이 아니오이면 자식 프로세스에서 상속 된 모든 파일 설명자를 닫는 방법이 있습니까?
+0

UNIX와 비슷한 시스템이라고 가정 할 때 사용자 별 fd 제한은 무엇입니까? – pilcrow

+0

사용자 당 제한이 있습니까? 나는 그걸 모른다 ... 프로세스 당 한도가 1024로 설정되어 있으므로 (0에서 1023까지 작동하므로 1024가 실패 함) ... – mtahmed

+0

사용자 프로세스의 리소스 제한이 체계. system() 전에'$^F'를 인쇄 할 수 있습니까? 현재 한계를보기 위해'system ('ulimit -n; exec your_command ...') 시도해 주시겠습니까? – pilcrow

답변

3

perlvar $^F에서 exec-close-on에 대해 설정된 파일 설명자를 제어하십시오. system()을 호출 할 때 모든 소켓 설명자를 닫는 기본 설정이 있어야합니다. 그렇지 않은 경우 $^F가 원하는 것으로 설정되지 않은 것 같습니다. 리눅스 시스템에 알려줄 수있는 매우 빠르고 쉬운 방법은 바로 기존 시스템() 호출하기 전에이 호출을 시도하는 것입니다 :

system("ls -l /proc/self/fd"); 

은 ls의 출력이 파일이 열려 있었는지를 보여줍니다 때 " ls "명령이 실행되었습니다. 대부분 stdin, stdout 및 stderr (설명자 0, 1 및 2) 만 열려 있지만 소켓 설명자가 열려 있으면 $^F = 2를 설정하고 도움이되는지 확인합니다.

+0

좋아, 28 일에 시도해 보겠습니다. 감사합니다 ... – mtahmed

+0

호기심에서 또 다른 질문 ... C의 하위 프로세스에서 열린 소켓을 닫는 방법을 알고 있습니까? – mtahmed

+0

물론, close-on-exec가 작동하지 않는 이유를 생각할 수 없다고 가정하면 (여전히 최선의 첫 번째 방법이라고 생각합니다.) stdin, stdout 및 stderr가 다음과 같이 닫히지 만 모든 것을 강제 할 수 있습니다. for (my $ fd = 3; $ fd <1024; $ fd ++) { close (F) 열려 있으면 (F, "<& = $ fd"); } ' – andy