Mein Kindprozess versucht, auf einen PCI-Adressraum zuzugreifen. Es funktioniert die meiste Zeit gut.Kindprozess generiert NUR Kern für SIGBUS-Fehler und wurde Zombie-Prozess
Aber manchmal geht der Kinderprozess in den Zombie-Zustand. dmesg-Protokolle zeigen den folgenden Busfehler an.
[ 501.134156] Caused by (from MCSR=10008): Bus - Read Data Bus Error
[ 501.134169] Oops: Machine check, sig: 7 [#1]
In diesem Fall wird keine Core-Datei generiert.
Core wird für SIGSEGV-Fehler vom untergeordneten Prozess generiert. Also nehme ich an, dass es nichts mit den Berechtigungen/ulimit-Einstellungen zu tun hat.
Kann mir jemand helfen zu verstehen, warum Core in diesem Fall nicht generiert wird?
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:/]$
Ich gehe davon aus, dass Sie Ihren Code überprüft haben, um zu sehen, ob Sie nach einem Lesefehler absichtlich/versehentlich beenden. Angenommen, der Elternteil lebt noch, können Sie auf das Kind warten und den Beendigungsstatus und den Rückkehrcode lesen? – Ram
Übergeordneter Prozess ist eine Shell-Skriptdatei, die den untergeordneten Prozess startet und auf seiner PID wartet. –
Der Elternprozess ist nicht über den SIGBUS-Absturz des Kindes informiert und wartet immer noch auf seine PID. Der untergeordnete Prozess erhält SIGBUS, wenn er versucht, von einem der PCI-Geräteregister zu lesen. Ich verlasse diesen Kindprozess nicht und es geht in den Zombie-Zustand, sobald der Lesefehler passiert ist. –