2012-01-26 4 views
4

소켓을 사용하는 API를 작성하고 있습니다. API에서는 다양한 항목에 대해 메모리를 할당합니다. 나는 소켓을 닫고 Ctrl-C와 같은 신호가있을 경우 메모리를 확보하고 싶다. 이 연구에서 free()가 safe function list (man 7 시그널)에 없기 때문에 시그널 핸들러 내부의 메모리를 해제 할 수는 없습니다. 소켓을 잘 닫을 수는 있습니다. 어떤 사람들이 내가 그 기억을 어떻게 풀 수 있는지에 대해 어떤 생각을 가지고 있습니까? 시간 내 미리 감사드립니다.신호 처리기 안에 메모리를 확보하십시오.

+0

신호에서 생존 할 계획을 추가 하시겠습니까? – frankc

+0

아니요. 방금 전에 메모리와 소켓을 정리하고 싶었습니다. – Mike

답변

5

또는 신호를 잡아 내지 말고 OS가 처리 정리 중에 수행 할 정리 만 처리하도록하십시오. 프로세스에 직접 연결되지 않은 자원을 릴리스하지 않으므로 수동으로 릴리스 할 필요가 없습니다.

+0

당신과 R이 말한 것이 합리적이라고 생각합니다. 먼저 응용 프로그램이 모든 신호 처리를 수행하게하십시오 (더 나은 의미를 가짐). 나는 SIGINT 나 SIGSEGV가 소켓을 닫을 지 확신하지 못했습니다. 나는 그들이 약간의 타임 아웃이 발생할 때까지 그들을 열어 둘 것을 염려했다. 나를 고쳐 줘서 고마워. – Mike

+0

프로세스가 종료 될 때 정리할 수 있기 때문에 허용 된 리소스 누수에 대한 나쁜 경험을했습니다.설명하기가 힘든 이상한 충돌을 보았습니다. 그리고 다른 이유가 없다면 : 컴파일러 나 정적 분석기에서 경고를 필요로하지 않으려면 빌드 유지 관리가 더 성가 시게됩니다. –

2

핸들러에서 해제하지 마십시오. 대신 프로그램에서 무언가가 해제되어야한다고 지시하십시오. 그런 다음 프로그램에서이를 감지하여 신호 컨텍스트가 아닌 주 컨텍스트에서 자유 로워 질 수 있습니다.

4

하나 개의 기술 (다른 사람도 존재) :

  1. 이 프로그램은 주 처리 루프를 실행하게한다.
  2. 기본 처리 루프에 "계속 실행 중인지"를 확인하는 플래그를 확인하십시오.
  3. 신호 처리기에 "keep running"플래그를 false로 설정하고 프로그램을 종료하지 않도록하십시오.
  4. 메인 처리 루프가 종료되기 전에 메모리 정리를 수행하도록하십시오.

이렇게하면 할당 및 할당 해제를 알려진 시퀀스로 호출되는 코드 블록에 배치 할 수 있습니다. 그렇게하면 상호 관련된 객체의 웹을 처리 할 때 신의 가호가 될 수 있으며 동일한 객체를 엉망으로 만드는 두 가지 처리 흐름간에 경쟁 조건이되지 않을 수 있습니다.

+0

이것은 라이브러리 API이므로 메인 루프는 여기에 해당되지 않습니다. – Mike

+0

라이브러리가 아닌 응용 프로그램을 빌드 중이므로이 솔루션은 제 문제에 완벽합니다. 답변 주셔서 감사합니다! –

2

라이브러리 또는 응용 프로그램을 쓰고 있습니까? 라이브러리를 작성하는 경우 신호 처리기를 설치하지 않아도되므로 호출 응용 프로그램과 충돌합니다. 이러한 신호를 원하는대로 처리 한 다음 (시그널 핸들러 컨텍스트 외부에서) 라이브러리에 적절한 정리 호출을 수행하는 것은 응용 프로그램의 비즈니스입니다.

물론 응용 프로그램을 작성하는 경우에도 소켓을 닫고 메모리를 확보하려면 SIGINT을 처리 할 이유가 없습니다. 신호를 처리하는 유일한 이유는 이 종료되기를 원하지 않는 경우 또는 종료하기 전에 정리해야하는 데이터가 저장되지 않았거나 공유 상태 (공유 메모리 또는 파일 시스템의 항목과 같음)이 필요한 경우입니다. 메모리를 확보하거나 자신의 프로세스에서 순수하게 사용되는 파일 설명자를 닫는 것은 종료 할 때 수행해야하는 작업이 아닙니다.

+0

확인. 좋은 지적. 고맙습니다. – Mike

관련 문제