소켓을 사용하는 API를 작성하고 있습니다. API에서는 다양한 항목에 대해 메모리를 할당합니다. 나는 소켓을 닫고 Ctrl-C와 같은 신호가있을 경우 메모리를 확보하고 싶다. 이 연구에서 free()가 safe function list (man 7 시그널)에 없기 때문에 시그널 핸들러 내부의 메모리를 해제 할 수는 없습니다. 소켓을 잘 닫을 수는 있습니다. 어떤 사람들이 내가 그 기억을 어떻게 풀 수 있는지에 대해 어떤 생각을 가지고 있습니까? 시간 내 미리 감사드립니다.신호 처리기 안에 메모리를 확보하십시오.
답변
또는 신호를 잡아 내지 말고 OS가 처리 정리 중에 수행 할 정리 만 처리하도록하십시오. 프로세스에 직접 연결되지 않은 자원을 릴리스하지 않으므로 수동으로 릴리스 할 필요가 없습니다.
당신과 R이 말한 것이 합리적이라고 생각합니다. 먼저 응용 프로그램이 모든 신호 처리를 수행하게하십시오 (더 나은 의미를 가짐). 나는 SIGINT 나 SIGSEGV가 소켓을 닫을 지 확신하지 못했습니다. 나는 그들이 약간의 타임 아웃이 발생할 때까지 그들을 열어 둘 것을 염려했다. 나를 고쳐 줘서 고마워. – Mike
프로세스가 종료 될 때 정리할 수 있기 때문에 허용 된 리소스 누수에 대한 나쁜 경험을했습니다.설명하기가 힘든 이상한 충돌을 보았습니다. 그리고 다른 이유가 없다면 : 컴파일러 나 정적 분석기에서 경고를 필요로하지 않으려면 빌드 유지 관리가 더 성가 시게됩니다. –
핸들러에서 해제하지 마십시오. 대신 프로그램에서 무언가가 해제되어야한다고 지시하십시오. 그런 다음 프로그램에서이를 감지하여 신호 컨텍스트가 아닌 주 컨텍스트에서 자유 로워 질 수 있습니다.
하나 개의 기술 (다른 사람도 존재) :
- 이 프로그램은 주 처리 루프를 실행하게한다.
- 기본 처리 루프에 "계속 실행 중인지"를 확인하는 플래그를 확인하십시오.
- 신호 처리기에 "keep running"플래그를 false로 설정하고 프로그램을 종료하지 않도록하십시오.
- 메인 처리 루프가 종료되기 전에 메모리 정리를 수행하도록하십시오.
이렇게하면 할당 및 할당 해제를 알려진 시퀀스로 호출되는 코드 블록에 배치 할 수 있습니다. 그렇게하면 상호 관련된 객체의 웹을 처리 할 때 신의 가호가 될 수 있으며 동일한 객체를 엉망으로 만드는 두 가지 처리 흐름간에 경쟁 조건이되지 않을 수 있습니다.
이것은 라이브러리 API이므로 메인 루프는 여기에 해당되지 않습니다. – Mike
라이브러리가 아닌 응용 프로그램을 빌드 중이므로이 솔루션은 제 문제에 완벽합니다. 답변 주셔서 감사합니다! –
라이브러리 또는 응용 프로그램을 쓰고 있습니까? 라이브러리를 작성하는 경우 신호 처리기를 설치하지 않아도되므로 호출 응용 프로그램과 충돌합니다. 이러한 신호를 원하는대로 처리 한 다음 (시그널 핸들러 컨텍스트 외부에서) 라이브러리에 적절한 정리 호출을 수행하는 것은 응용 프로그램의 비즈니스입니다.
물론 응용 프로그램을 작성하는 경우에도 소켓을 닫고 메모리를 확보하려면 SIGINT
을 처리 할 이유가 없습니다. 신호를 처리하는 유일한 이유는 이 종료되기를 원하지 않는 경우 또는 종료하기 전에 정리해야하는 데이터가 저장되지 않았거나 공유 상태 (공유 메모리 또는 파일 시스템의 항목과 같음)이 필요한 경우입니다. 메모리를 확보하거나 자신의 프로세스에서 순수하게 사용되는 파일 설명자를 닫는 것은 종료 할 때 수행해야하는 작업이 아닙니다.
확인. 좋은 지적. 고맙습니다. – Mike
- 1. 올바른 방법으로 메모리를 확보하십시오.
- 2. sem_wait 및 신호 처리기
- 3. 신호 처리기 sa_sigaction을 인수
- 4. 유닉스 프로그래밍 - 신호 처리기
- 5. Perl 5.10.0 신호 처리기 문제
- 6. 알려진 지점에서 신호 처리기 실행
- 7. scanf 루프 및 신호 처리기
- 8. 이식 OS-9 신호 처리기
- 9. 사용자 공간의 C/C++ 타이머 신호 처리기
- 10. I/O 용 트리거 신호 처리기
- 11. 다중 스레드 환경에서 신호 처리기 기능
- 12. 신호 처리기 내에서 스레드 취소 중
- 13. 이중 Wordpress 설치를 결합하고 확보하십시오
- 14. Symfony 2에서 다운로드 링크를 확보하십시오.
- 15. Qt/C++ : 이벤트 처리기 (신호)에서 상위 위젯 식별
- 16. django의 알림 시스템처럼 Facebook 용 다중 신호에 신호 처리기 연결
- 17. 신호 처리기 vs 가상 함수 및 상속 (이벤트 처리)
- 18. 특정 신호에 대한 신호 처리기 등록이 다른 등록 신호를 무시합니까?
- 19. 두 개의 특정 이벤트가 발생할 때 이벤트 처리기 신호
- 20. 문자열이 아닌 변수가 window.onerror 이벤트의 처리기 안에 포함될 수 있습니까?
- 21. 신호 수신 신호 SIGIO
- 22. 비트 맵에서 안드로이드로 더 많은 공간을 확보하십시오.
- 23. 내 앱이 더 많은 메모리를 요구할 때 Android가 자동으로 메모리를 죽이거나 메모리를 비우지 않습니다.
- 24. 기본 신호 처리기를 실행
- 25. 신호 잡기 : 멤버 함수를 신호 처리기로 사용하십시오.
- 26. 처리기
- 27. 자바 스크립트 처리기
- 28. 커널이나 사용자 공간에서 신호 처리기가 실행됩니까?
- 29. setjmp/신호 크래시 예외 처리
- 30. 프로그램 수신 신호 : "EXC_BAD_ACCESS"
신호에서 생존 할 계획을 추가 하시겠습니까? – frankc
아니요. 방금 전에 메모리와 소켓을 정리하고 싶었습니다. – Mike