2010-03-05 2 views
3

큰 프로젝트의 여러 위치에서 호출 할 수있는 로깅 모듈에서 작업해야합니다. 문제는 모듈이 시그널 핸들러 내에서 실행되는 코드에서 호출 될 때가 있다는 것입니다. 일반적으로 로깅 모듈에는 localtime() 및 strftime()을 사용하는 시간 데이터가 포함되어 있지만 물론 이러한 호출은 비동기 신호에 안전하지 않으며 신호 처리기 내에서 호출되면 교착 상태가 발생할 수 있습니다. GNU/Linux 시스템에서 코드가 현재 신호 처리기 컨텍스트에서 실행 중인지 여부를 알려주는 방법이 있습니까? 예 : 처리하는 동안 모든 신호 처리기에 플래그를 설정하는 것 외에는? 신호 처리기를 단순화하는 것이 더 좋을 것이라고 생각하지만,이 경우 로깅 모듈을 호출 할 위치를 선택할 필요가 없습니다. 신호 처리 중에 모듈이 호출되면 타임 스탬프 정보를 테스트하고 생략 할 수 있다면 좋을 것입니다.내가 신호 처리기에 있는지 테스트 할 방법이 있습니까?

+0

신호 처리기에서 시스템 호출을받는 것은 좋지 않은 생각입니다. 여기에서 보호 하시겠습니까? – JXG

+0

그래, 일종의 문제 야. 나는 안전하지 않은 시스템 호출을 피하고 싶다 * 만약 내가 시그널 핸들러에있다면 시그널 핸들러에 없을 때 코드가 호출된다면 그것들을 사용할 수있다. –

답변

2

우선, 귀하의 질문 ("나는 신호 처리기에 있습니까?")에 잘 정의 된 대답이 없습니다. 다음 코드를 고려하십시오.

이 말처럼 많은 프로그램에서이 질문에 의미있게 대답 할 수있는 기술이 있습니다. 사용하지 않을 신호를 선택하고 sigaction을 사용하여 신호 처리기를 설치하여 취급하는 모든 신호의 경우 sa_mask에 추가하십시오. 그런 다음 sigprocmask을 사용하여 현재 신호 마스크를 확인할 수 있습니다. 지정된 신호가 신호 마스크에 있으면 신호 처리기가 호출되었고 아직 반환되지 않았 음을 의미합니다 (원래 신호 마스크를 복원하면 반환 됨).

+0

longjmp (또는 siglongjmp)에 대한 흥미로운 점이 있습니다. 나는 그것에 대해 생각해야하고 실제로 시그널 핸들러에 있어야한다는 것을 의미합니다. 내 주요 관심사는 내가 자물쇠를 들고있을 수있는 코드의 다른 부분에있을 수 있는지 여부를 아는 것입니다. 그런 종류의 일은 setjmp/longjmp가 안전하지 않을 것입니다. 어쨌든 저는 어디에서나 jmp 함수를 실제로 사용하지 않습니다. 그들은 그 문제를 일으킬 수 있습니다. 나는 sigaction/sa_mask 제안을 좋아한다. 그것은 기본적으로 정확하게 내가 원하는 것 같다. –

0

시스템에 sigpending이 있습니까? 나는 그 기능의 행동이 신호 처리기 중에 무엇인지 알지 못한다. 그러나 설정된 플래그가 반환되면 신호가 보류중인 경우 비관적이며 비동기 안전하지 않은 호출을 건너 뛸 수 있습니다.

+1

신호가 전달되기 전에 sigpending이 설정되어 있다고 생각합니다. 신호 처리기가 입력되면 신호가 "보류 중"으로 설정되지 않습니다. –

3

가장 쉬운 방법은 (명명 된) 파이프 (최대 PIPE_MAX 쓰기) 또는 UDP 소켓 (idem)을 통해 로그하는 것입니다. 메시지 원점은 메시지를 생성하는 함수에 의해 설정 될 수 있습니다. 물론 실제로 메시지를 읽고 처리하는 프로세스가 필요하지만 시그널 핸들러 컨텍스트 외부에 보관할 수 있습니다.


은 BTW : 당신은 당신이 당신의 자신의 프로세스에 메시지를 보내고합니다 (FD_SET에 파이프를 (의 읽기 끝)를 추가 할 수 있습니다, 메시지를받을 수있는 별도의 프로세스가 필요하지 않습니다 프로그램이 앉아 제공 선택 또는 폴링 루프), 주기적으로 폴링합니다.

+0

또한하려고하는 것은 비뚤어 짐입니다. 시그널 핸들러에서 longjump하지 마라 (sigjump et.al 참조). 또한 stdio 함수는 신호에 대해 고려하지 않았습니다 (malloc() 등을 호출합니다) – wildplasser

+0

죄송합니다. 나는 R에 의한 프로그램에 대해 비꼬아 야한다고 말했습니다. 죄송합니다! – wildplasser

+0

나는이 일을하는 건지 소리가 나기 때문에이 답을 좋아하지만 별도의 절차를 추가하고 파이프를 통해 모든 로그 메시지를 보내고 싶지 않아도된다.나는 여전히 신호 처리기에 있었는지 여부를 쉽게 감지 할 수 있기를 바란다. 운영체제가 알기가 어려워서는 안된다. –

관련 문제