2013-08-12 2 views
1

리눅스에서는 사용자가 정의한 신호 번호 (예 : 신호 10)에 대한 신호 처리기를 설치한다고 가정합니다. 다음과 같은 것 : signal (fun, 10); // 사용자 정의 시그널을위한 시그널 핸들러로서의 fun() 10Linux의 내부 신호 처리기 테이블에 관한 정보?

나는이 배경 뒤에 무엇이 들어가고 있는지 물어보고 싶었다. 각 프로세스에 대한 내부 신호 처리기 테이블이 있다는 것을 알고 있습니다. 그러나 그 테이블에 대한 더 이상의 정보를 찾을 수 없었습니다.

제 질문은 프로세스에 대한 것입니다. 신호 및 해당 신호 핸들러의 주소와 관련된이 정보는 어디에 저장됩니까? 그리고 어떻게 gdb를 통해이 정보를 보거나 검사 할 수 있습니까? 리눅스 시그널 핸들러에서

+0

그 신호 처리 표는 커널 안에 대한 처리 신호에 대해 자세히 알아보십시오. gdb를 사용하여 볼 수 없습니다. –

답변

1

sighand 필드를 통해 유형 구조체 sighand_struct이 개체는 구조체의 task_struct에에서 참조

struct sighand_struct { 
    atomic_t  count; 
    struct k_sigaction action[_NSIG]; 
    spinlock_t  siglock; 
}; 

의 개체에 작업별로 저장됩니다. gdb (사용자 공간을위한 도구) 대신 의 충돌을 사용하십시오.

된 task_struct에서 읽기 :

crash> p/x *((struct task_struct*)0xdfcb04c0).sighand 
$9 = { 
    count = { 
    counter = 0x4 
    }, 
    action = {{ 
     sa = { 
     sa_handler = 0x0, 
     sa_flags = 0x0, 
     sa_restorer = 0x0, 
     sa_mask = { 
      sig = {0x0, 0x0} 
     } 
     } 
    }, { 
     sa = { 
     sa_handler = 0x0, 
     sa_flags = 0x0, 
     sa_restorer = 0x0, 
     sa_mask = { 
      sig = {0x0, 0x0} 
     } 
     } 
    }, { 
     sa = { 
     sa_handler = 0x0, 
     sa_flags = 0x0, 
     sa_restorer = 0x0, 
     sa_mask = { 
      sig = {0x0, 0x0} 
     } 
     } 
    }, { 
     sa = { 
     sa_handler = 0x4006ac0d, 
     sa_flags = 0x10000004, 
     sa_restorer = 0x0, 
     sa_mask = { 
      sig = {0x0, 0x0} 
     } 
     } 
... 

그래서, 우리는 사용자 프로세스 설치 기능은 주소 0x4006ac0d 가리키는 신호 4 (SIGILL이, ID 0 신호가 존재하지 않음) 것을 알 수있다. 그리고 이것은 우리는 간단한 명령으로 확인할 수 있습니다

crash> sig 0xdfcb04c0 
PID: 19658 TASK: dfcb04c0 CPU: 0 COMMAND: "FinalizerWatchd" 
SIGNAL_STRUCT: e49f33c0 NR_THREADS: 4 
SIG SIGACTION HANDLER  MASK  FLAGS 
[1] e49e8004 SIG_DFL 0000000000000000 0 
[2] e49e8018 SIG_DFL 0000000000000000 0 
[3] e49e802c SIG_DFL 0000000000000000 0 
[4] e49e8040 4006ac0d 0000000000000000 10000004 (SA_SIGINFO|SA_RESTART) 
[5] e49e8054 SIG_DFL 0000000000000000 0 
[6] e49e8068 4006ac0d 0000000000000000 10000004 (SA_SIGINFO|SA_RESTART) 
[7] e49e807c 4006ac0d 0000000000000000 10000004 (SA_SIGINFO|SA_RESTART) 
[8] e49e8090 4006ac0d 0000000000000000 10000004 (SA_SIGINFO|SA_RESTART) 

here와 충돌 here

관련 문제