내 자식 프로세스가 PCI 주소 공간에 액세스하려고합니다. 대부분의 경우 잘 작동합니다.자식 프로세스가 SIGBUS 오류에 대해서만 코어를 생성하지 않고 좀비 프로세스가되었습니다.
하지만, 때로는 하위 프로세스가 좀비 상태가됩니다. dmesg logs는 다음 버스 오류를 표시합니다.
[ 501.134156] Caused by (from MCSR=10008): Bus - Read Data Bus Error
[ 501.134169] Oops: Machine check, sig: 7 [#1]
이 경우 생성 된 핵심 파일이 없습니다.
[Linux:/]$ ps -axl | grep tes1
4 0 6805 32495 20 0 0 0 exit Zl ? 0:05 [test1] <defunct>
[Linux:/]$
하위 프로세스에서 SIGSEGV 오류에 대해 코어가 생성됩니다. 그래서 나는 권한/ulimit 설정과 관련이 없다고 가정합니다.
이 경우 코어가 생성되지 않는 이유를 이해하는 데 도움을 줄 수 있습니까?
Child Process:
--------------
[Linux:/]$ cat /proc/6805/status
Name: test1
State: Z (zombie)
Tgid: 6805
Pid: 6805
PPid: 32495
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 0
Groups:
Threads: 2
SigQ: 18/13007
SigPnd: 0000000002000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001006
SigCgt: 0000000182000200
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
Seccomp: 0
Cpus_allowed: 3
Cpus_allowed_list: 0-1
voluntary_ctxt_switches: 8998
nonvoluntary_ctxt_switches: 857
Stack:
-------
[Linux:/]$ cat /proc/6805/stack
[<00000000>] (nil)
[<c0008640>] __switch_to+0xc0/0x160
[<c004b4f4>] do_exit+0x5d4/0xa70
[<c000c694>] die+0x224/0x310
[<c000ce44>] machine_check_exception+0x124/0x1e0
[<c00123bc>] ret_from_mcheck_exc+0x0/0x14c
[Linux:/]$
Parent Process:
---------------
[Linux:/]$ cat /proc/32495/status
Name: test
State: S (sleeping)
Tgid: 32495
Pid: 32495
PPid: 21911
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups:
VmPeak: 4820 kB
VmSize: 4820 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 2548 kB
VmRSS: 2548 kB
VmData: 1284 kB
VmStk: 132 kB
VmExe: 900 kB
VmLib: 1976 kB
VmPTE: 24 kB
VmSwap: 0 kB
Threads: 1
SigQ: 19/13007
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000001006
SigCgt: 0000000043816ef9
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
Seccomp: 0
Cpus_allowed: 3
Cpus_allowed_list: 0-1
voluntary_ctxt_switches: 274
nonvoluntary_ctxt_switches: 145
[Linux:/]$
코드를 검사하여 읽기 실패 후 의도적으로/실수로 종료했는지 확인 중이라고 가정합니다. 부모가 아직 살아 있다고 가정하면 자식을 기다리고 종료 상태 및 반환 코드를 읽을 수 있습니까? – Ram
상위 프로세스는 하위 프로세스를 시작하고 해당 PID를 기다리는 쉘 스크립트 파일입니다. –
부모 프로세스는 하위의 SIGBUS 충돌을 인식하지 못하고 해당 PID를 계속 기다리고 있습니다. 자식 프로세스는 PCI 장치 레지스터 중 하나에서 읽기를 시도 할 때 SIGBUS를 가져옵니다. 나는이 자식 프로세스를 종료하지 않고 읽기 실패가 발생하자마자 좀비 상태로 간다. –