큰 프로젝트의 여러 위치에서 호출 할 수있는 로깅 모듈에서 작업해야합니다. 문제는 모듈이 시그널 핸들러 내에서 실행되는 코드에서 호출 될 때가 있다는 것입니다. 일반적으로 로깅 모듈에는 localtime() 및 strftime()을 사용하는 시간 데이터가 포함되어 있지만 물론 이러한 호출은 비동기 신호에 안전하지 않으며 신호 처리기 내에서 호출되면 교착 상태가 발생할 수 있습니다. GNU/Linux 시스템에서 코드가 현재 신호 처리기 컨텍스트에서 실행 중인지 여부를 알려주는 방법이 있습니까? 예 : 처리하는 동안 모든 신호 처리기에 플래그를 설정하는 것 외에는? 신호 처리기를 단순화하는 것이 더 좋을 것이라고 생각하지만,이 경우 로깅 모듈을 호출 할 위치를 선택할 필요가 없습니다. 신호 처리 중에 모듈이 호출되면 타임 스탬프 정보를 테스트하고 생략 할 수 있다면 좋을 것입니다.내가 신호 처리기에 있는지 테스트 할 방법이 있습니까?
답변
우선, 귀하의 질문 ("나는 신호 처리기에 있습니까?")에 잘 정의 된 대답이 없습니다. 다음 코드를 고려하십시오.
이 말처럼 많은 프로그램에서이 질문에 의미있게 대답 할 수있는 기술이 있습니다. 사용하지 않을 신호를 선택하고 sigaction
을 사용하여 신호 처리기를 설치하여 취급하는 모든 신호의 경우 sa_mask
에 추가하십시오. 그런 다음 sigprocmask
을 사용하여 현재 신호 마스크를 확인할 수 있습니다. 지정된 신호가 신호 마스크에 있으면 신호 처리기가 호출되었고 아직 반환되지 않았 음을 의미합니다 (원래 신호 마스크를 복원하면 반환 됨).
longjmp (또는 siglongjmp)에 대한 흥미로운 점이 있습니다. 나는 그것에 대해 생각해야하고 실제로 시그널 핸들러에 있어야한다는 것을 의미합니다. 내 주요 관심사는 내가 자물쇠를 들고있을 수있는 코드의 다른 부분에있을 수 있는지 여부를 아는 것입니다. 그런 종류의 일은 setjmp/longjmp가 안전하지 않을 것입니다. 어쨌든 저는 어디에서나 jmp 함수를 실제로 사용하지 않습니다. 그들은 그 문제를 일으킬 수 있습니다. 나는 sigaction/sa_mask 제안을 좋아한다. 그것은 기본적으로 정확하게 내가 원하는 것 같다. –
시스템에 sigpending
이 있습니까? 나는 그 기능의 행동이 신호 처리기 중에 무엇인지 알지 못한다. 그러나 설정된 플래그가 반환되면 신호가 보류중인 경우 비관적이며 비동기 안전하지 않은 호출을 건너 뛸 수 있습니다.
신호가 전달되기 전에 sigpending이 설정되어 있다고 생각합니다. 신호 처리기가 입력되면 신호가 "보류 중"으로 설정되지 않습니다. –
가장 쉬운 방법은 (명명 된) 파이프 (최대 PIPE_MAX 쓰기) 또는 UDP 소켓 (idem)을 통해 로그하는 것입니다. 메시지 원점은 메시지를 생성하는 함수에 의해 설정 될 수 있습니다. 물론 실제로 메시지를 읽고 처리하는 프로세스가 필요하지만 시그널 핸들러 컨텍스트 외부에 보관할 수 있습니다.
은 BTW : 당신은 당신이 당신의 자신의 프로세스에 메시지를 보내고합니다 (FD_SET에 파이프를 (의 읽기 끝)를 추가 할 수 있습니다, 메시지를받을 수있는 별도의 프로세스가 필요하지 않습니다 프로그램이 앉아 제공 선택 또는 폴링 루프), 주기적으로 폴링합니다.
또한하려고하는 것은 비뚤어 짐입니다. 시그널 핸들러에서 longjump하지 마라 (sigjump et.al 참조). 또한 stdio 함수는 신호에 대해 고려하지 않았습니다 (malloc() 등을 호출합니다) – wildplasser
죄송합니다. 나는 R에 의한 프로그램에 대해 비꼬아 야한다고 말했습니다. 죄송합니다! – wildplasser
나는이 일을하는 건지 소리가 나기 때문에이 답을 좋아하지만 별도의 절차를 추가하고 파이프를 통해 모든 로그 메시지를 보내고 싶지 않아도된다.나는 여전히 신호 처리기에 있었는지 여부를 쉽게 감지 할 수 있기를 바란다. 운영체제가 알기가 어려워서는 안된다. –
- 1. gtk 신호 처리기에 둘 이상의 변수를 전달하는 방법은 무엇입니까?
- 2. Glade : 신호 처리기에 하나 이상의 인수를 전달하려면 어떻게합니까?
- 3. C define이 gnu Makefile에 선언되어 있는지 테스트 할 수 있습니까?
- 4. 노래가 iPhone에 있는지 확인하는 방법이 있습니까?
- 5. 포인터가 매달려 있는지 확인하는 방법이 있습니까?
- 6. Java RMI 객체가 생존하고 있는지 어떻게 테스트 할 수 있습니까?
- 7. VB6에서 Function/Sub를 사용할 수 있는지 테스트 할 수 있습니까?
- 8. 선택 상자에 몇 개의 옵션이 있는지 테스트 할 수 있습니까?
- 9. Genshi 스트림에 문자열이 있는지 어떻게 테스트 할 수 있습니까?
- 10. AppleScript에서 이미지가 비어 있는지 어떻게 테스트 할 수 있습니까?
- 11. 휴대 전화에 하드웨어 키보드가 있는지 감지 할 수있는 방법이 있습니까?
- 12. window.location.href에 단어가 있는지 테스트 할 조건
- 13. PHP가 JS에서만로드되고 있는지 확인하는 방법이 있습니까?
- 14. 아이폰없이 아이폰없이 웹 사이트를 테스트 할 수있는 방법이 있습니까?
- 15. 도구를 사용하지 않고 iPhone 앱을 테스트 할 수있는 방법이 있습니까?
- 16. 실행중인 브라우저없이 Comet 응용 프로그램을 테스트 할 수있는 방법이 있습니까?
- 17. Mac을 구입하지 않고 Mac에서 소프트웨어를 테스트 할 수있는 방법이 있습니까?
- 18. Ruby의 Test :: Unit :: TestCase에는 테스트 할 메소드의 총 수를 테스트 할 수있는 방법이 있습니까?
- 19. Facebook : 특정 권한이 있는지 확인하는 방법이 있습니까?
- 20. Silverlight의 DataGrid에 포커스가 있는지 확인하는 방법이 있습니까?
- 21. NSArray에 무언가가 있는지 검색하는 빠른 방법이 있습니까?
- 22. 마이크에 입력이 있는지 여부를 확인할 방법이 있습니까?
- 23. 탐색 스택에 페이지가 있는지 확인하는 방법이 있습니까?
- 24. 안드로이드에서 처리기에 관한 쿼리
- 25. 테스트 할 사이트가 있습니까?
- 26. C#의 이벤트 처리기에 늦게 바인딩 할 수 있습니까?
- 27. QTableWidget 신호 cellChanged는() : 내가 PyQt는 사용하고 루틴
- 28. 단위 테스트 방법이 방법은?
- 29. XBL 처리기에 이름을 지정할 수 있습니까?
- 30. 안드로이드에서 처리기에 대한 질문
신호 처리기에서 시스템 호출을받는 것은 좋지 않은 생각입니다. 여기에서 보호 하시겠습니까? – JXG
그래, 일종의 문제 야. 나는 안전하지 않은 시스템 호출을 피하고 싶다 * 만약 내가 시그널 핸들러에있다면 시그널 핸들러에 없을 때 코드가 호출된다면 그것들을 사용할 수있다. –