2014-01-14 4 views
0

2.6.33을 실행하는 ARM 기반 임베디드 시스템이 있습니다. 주 프로세스 -A는 다른 프로세스 -B를 생성합니다. 둘 다 실시간 RR 정책을 사용하는 응용 프로세스입니다. 이 proc-B는 pthread_create()로 쓰레드를 거의 생성하지 않습니다. 스레드 중 하나가 잘못하고 프로세스가 중지 된 것 같습니다.스레드로 전달 된 신호를 알아내는 방법

프로세스 A에서 wait()를 사용하면 다음과 같이 상태 1이 반환됩니다 (NORMAL).

프로세스 -B 내에서 어떤 신호가 어떤 스레드로 전달되었는지 얻고 싶습니다.

waitpid(-1, &status, WUNTRACED | WCONTINUED) 
    and 
    if (WIFEXITED(status)) 
    printf("Process %d terminated normally, status %d\n", pid,WEXITSTATUS(status)); 

링크를 이어하지만 http://www.cs.cf.ac.uk/Dave/C/node32.html#SECTION003240000000000000000

모든 스레드의 올바른 종료 상태를 발견하고 이러한 스레드로 전송하는 경우 신호를 어떤 다른 방법이 있나요 1과 동일한 상태를 가지고?

답변

1

우선, 멀티 스레딩과 시그널링이 잘 어울리지 않는다는 것을 알아야합니다! 이는 신호가 PID로 전달된다는 사실 때문에 큰 이유입니다. MT 앱에는 PID가 1 개 있지만 스레드가 여러 개 있습니다. 어떤 스레드가 신호를 '처리'할 것인가?

따라서 '일반적인'전략은 전용 동기식 '신호 처리기'스레드 (일반적으로 sigwait (2) 차단을 발행 함)를 제외한 모든 스레드에서 모든 신호를 차단하는 것입니다. 반환 값은 도착했다! Here's a (simplistic) app 스레드 및 시그널링을 데모 할 수 있습니다.

둘째, 프로세스가 어떻게 기술적/기술적으로 사망했는지에 대한 세부 정보를 이해하려면 SA_SIGINFO 플래그와 함께 sigaction (2)을 사용하십시오. 신호 처리기의 서명은 지금 :

void func(int signo, siginfo_t *info, void *context) 

구조체의 siginfo_t 당신이이 프로세스는이 신호를받은 이유/방법에 대해 필요한 모든 세부 사항을 줄 것이다! Ref : sigaction(2) man page. 물론이 접근법을 사용한다는 것은 sigwait .. async vs sync handling 대신 sigaction을 사용한다는 것을 의미합니다. HTH.

관련 문제