오늘은 특정 process 의 signal 상태에 대해 알아보는 법을 살펴 봅시다.
커맨드는 단순 합니다.
# cat /proc/1548/status
Name: phonestatus-ser
State: S (sleeping)
Tgid: 1548
Pid: 1548
PPid: 1529
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 32
Groups:
VmPeak: 6760 kB
VmSize: 6760 kB
VmLck: 0 kB
VmHWM: 3116 kB
VmRSS: 3116 kB
VmData: 472 kB
VmStk: 84 kB
VmExe: 32 kB
VmLib: 4832 kB
VmPTE: 12 kB
Threads: 1
SigQ: 1/3704
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000381002
SigCgt: 40000001800004ec
CapInh: 0000000000000000
CapPrm: fffffffffffffeff
CapEff: fffffffffffffeff
CapBnd: fffffffffffffeff
voluntary_ctxt_switches: 425
nonvoluntary_ctxt_switches: 314
Name: phonestatus-ser
State: S (sleeping)
Tgid: 1548
Pid: 1548
PPid: 1529
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 32
Groups:
VmPeak: 6760 kB
VmSize: 6760 kB
VmLck: 0 kB
VmHWM: 3116 kB
VmRSS: 3116 kB
VmData: 472 kB
VmStk: 84 kB
VmExe: 32 kB
VmLib: 4832 kB
VmPTE: 12 kB
Threads: 1
SigQ: 1/3704
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000381002
SigCgt: 40000001800004ec
CapInh: 0000000000000000
CapPrm: fffffffffffffeff
CapEff: fffffffffffffeff
CapBnd: fffffffffffffeff
voluntary_ctxt_switches: 425
nonvoluntary_ctxt_switches: 314
이중 굵은 글씨의 항목이 signal 과 관련된 항목 들입니다.
kernel 소스에서 Documentation/filesystems/proc.txt 를 보면 각 항목에 대한 설명이 있습니다.
SigQ number of signals queued/max. number for queue
SigPnd bitmap of pending signals for the thread
ShdPnd bitmap of shared pending signals for the process
SigBlk bitmap of blocked signals
SigIgn bitmap of ignored signals
SigCgt bitmap of catched signals
CapInh bitmap of inheritable capabilities
CapPrm bitmap of permitted capabilities
CapEff bitmap of effective capabilities
CapBnd bitmap of capabilities bounding set
Cpus_allowed mask of CPUs on which this process may run
Cpus_allowed_list Same as previous, but in "list format"
여기서 bitmap 으로 표시되었다고 하는데요.
참 표현이 애매합니다.
찾아보면 다음과 같습니다.
static inline void sigaddset(sigset_t *set, int _sig)
{
unsigned long sig = _sig - 1;
if (_NSIG_WORDS == 1)
set->sig[0] |= 1UL << sig;
else
set->sig[sig / _NSIG_BPW] |= 1UL << (sig % _NSIG_BPW);
}
결국 해당 순서에 맞추어 한 bit 씩 밀어서 ordering 한 것입니다.
예를 들면
signal 1 을 check 한다면
0000 0000 0000 0001
이 되겠지요 (2진수)
signal 5 를 check 한다면
0000 0000 0001 0000
입니다.
SigIgn: 0000000000381002
이렇게 결과가 나온것이 있는데요.
이것은 16진수 이므로 이진수로 변형하면 => 11 1000 0001 0000 0000 0010
ignore 된 signal number 는 2, 13, 20, 21, 22
이므로 각각
#define SIGINT 2
#define SIGPIPE 13
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
이 되겠군요.
'Programming > Linux_Kernel' 카테고리의 다른 글
wait queue (0) | 2010.08.02 |
---|---|
restart_syscall 의 호출 경로 - 작성중 (1) | 2010.07.13 |
linux system call 의 호출 구조 (0) | 2010.07.09 |
__initdata keyword in kernel (0) | 2010.06.24 |
linux virtual memory - Zone, Node, Section 의 개념 (0) | 2010.06.09 |