ซอมบี้สามารถมีเด็กกำพร้าได้หรือไม่? เด็กกำพร้าจะถูกรบกวนจากการเก็บซอมบี้หรือไม่?


27

ตามที่ฉันเข้าใจแล้วกระบวนการซอมบี้ตายไปแล้ว แต่ยังคงมีอยู่เป็นตัวยึดตำแหน่งในตารางกระบวนการจนกว่าผู้ปกครองของมัน (หรือinitหากตัวเองเป็นผีดิบกำพร้า) ตรวจสอบสถานะทางออกของมัน

และความเข้าใจของฉันเกี่ยวกับกระบวนการเด็กกำพร้าก็คือพวกเขาเป็นกระบวนการที่ยังมีชีวิตอยู่และทำงานอยู่ แต่พ่อแม่ของเขาเสียชีวิต

เมื่อซอมบี้ตายไปแล้วเด็ก ๆ ของพวกมันจะกลายเป็นเด็กกำพร้าใช่ไหม? พวกเขาจะได้รับผลกระทบหรือไม่เมื่อได้รับผลผีดิบ? โดยเฉพาะจะinitรับเอาพวกมันมาเป็นลูกของมันต่อเมื่อซอมบี้ถูกเก็บเกี่ยวหรือพวกมันจะถูกเลี้ยงทันทีที่แม่กลายเป็นซอมบี้?


มันสมเหตุสมผลสำหรับกระบวนการของเด็กที่จะรับการชดใช้initทันทีที่ผู้ปกครองเสียชีวิต (และนั่นรวมถึงการกลายเป็นซอมบี้) ซอมบี้จะไม่ดูแลลูก ๆ ของมัน มันจะไม่ทำอะไรเลย มันเป็นเพียงข้อมูลสถานะการตายลอยอยู่รอบ ๆ ในpidจุดที่
PSkocik

นั่นหมายความว่าเด็กกำพร้าของซอมบี้ไม่สามารถกลายเป็นซอมบี้ได้เพราะพวกเขาได้รับการดูแลทันทีinit?
Wildcard

แก้ไข. หรือถ้าพวกเขากลายเป็นซอมบี้มันจะเป็นระยะเวลาจิ๋วจนกว่าจะถึงเวลาinitเก็บเกี่ยว
PSkocik

6
ฉันไม่สามารถรอจนกว่าชื่อของคำถามนี้จะปรากฏในส่วน "คำถามเครือข่ายน่าสนใจ" ...
Nathan Osman

@NathanOsman นั่นคงยอดเยี่ยม แต่ดูเหมือนว่าจะไม่ไป :(
ไวด์การ์ดใน

คำตอบ:


15

ตามที่ฉันเข้าใจแล้วกระบวนการซอมบี้ตายไปแล้ว แต่ยังคงมีอยู่เป็นตัวยึดตำแหน่งในตารางกระบวนการจนกว่าผู้ปกครองของมัน (หรือเริ่มต้นถ้าซอมบี้ตัวเองเป็นเด็กกำพร้า) ตรวจสอบสถานะทางออกของมัน

แก้ไข.

และความเข้าใจของฉันเกี่ยวกับกระบวนการเด็กกำพร้าก็คือพวกเขาเป็นกระบวนการที่ยังมีชีวิตอยู่และทำงานอยู่ แต่พ่อแม่ของเขาเสียชีวิต

แก้ไข.

เมื่อซอมบี้ตายไปแล้วเด็ก ๆ ของพวกมันจะกลายเป็นเด็กกำพร้าใช่ไหม?

ใช่. เมื่อผู้ปกครองเสียชีวิตก็จะตาย ด้วยความเคารพต่อลูก ๆ มันไม่สำคัญว่าพ่อแม่จะอยู่ในฐานะซอมบี้หรือไม่: เด็ก ๆ กลายเป็นเด็กกำพร้าในเวลาที่พ่อแม่เสียชีวิตและจากนั้นพวกเขาก็ขาดการติดต่อกับพ่อแม่

พวกเขาจะได้รับผลกระทบหรือไม่เมื่อได้รับผลผีดิบ โดยเฉพาะจะเริ่มรับเอาพวกเขามาเป็นลูกของมันเมื่อซอมบี้ถูกเก็บเกี่ยวหรือพวกเขาจะได้รับการอุปการะทันทีที่พ่อแม่กลายเป็นซอมบี้?

ไม่และหลังตามข้างต้น


8

หากผลการทดลองใช้จะปรากฏขึ้นอย่างน้อยที่สุดsystemdinit จะทำการเก็บเกี่ยวเด็กกำพร้าของซอมบี้ทันทีที่ทำได้:

foo.c:

#include <unistd.h>

int main(void)
{
    pid_t child = fork();
    if (child < 0)
        return -1;
    if (child == 0)
    {
        pid_t grand_child = fork();
        if (grand_child < 0)
            return -1;
        if (grand_child == 0)
            sleep (1000);
        else
            return 0;
    }
    else
        sleep (1000);
    return 0;
}

ในหนึ่งเทอร์มินัล:

$ gcc -o foo foo.c
$ ./foo

ในเทอร์มินัลอื่น:

$ pgrep foo                         
25548
25549
25550
$ pstree -pa 25548
foo,25548
  └─(foo,25549)
$ pstree -psa 25550
systemd,1
  └─foo,25550
$ ps -o stat,pid -p $(pgrep -d, foo)
STAT   PID
S+   25548
Z+   25549
S+   25550

และก็ควรที่เป็นหน้าที่ของมัน
Gilles 'หยุดความชั่วร้าย'

@Gilles แน่ใจว่าการรวบรวมเด็กกำพร้าเป็นงานของ init แต่มีมาตรฐานที่กำหนดว่าควรรวบรวมเมื่อใด มิฉะนั้นฉันคิดว่าการใช้งานอาจมีระยะเวลาเพิ่มขึ้นบ้าง
muru

ฉันไม่คิดว่าจะมีมาตรฐานเป็นลายลักษณ์อักษรสำหรับสิ่งนั้น POSIXระบุไว้เพียงว่า "ID กระบวนการหลักของกระบวนการลูกที่มีอยู่ทั้งหมดและกระบวนการ zombie ของกระบวนการโทรจะต้องถูกตั้งค่าเป็น ID กระบวนการของกระบวนการระบบที่กำหนดการใช้งาน" ไม่ได้กล่าวว่ากระบวนการของระบบนั้นคืออะไร ควรจะทำหรือแม้กระทั่งแจ้งให้ทราบถึงกระบวนการของระบบ ภายใต้ระบบ Unix กระบวนการของระบบนั้นคือ PID 1 จะได้รับ SIGCLD และจะประมวลผลอีกครั้งทันทีที่มันเข้าใกล้
Gilles 'หยุดความชั่วร้าย'

@Gilles หมายถึงอาจมีบางคน (อาจเป็น kinemortophobic) บางแห่งที่ตัดสินใจที่จะเลื่อนการเลี้ยงเด็กของซอมบี้จนกว่าซอมบี้จะหายไป?
muru

นอกจากนี้คุณยังอาจต้องการที่จะเตือน Gilles ของunix.stackexchange.com/a/177361/5132 ตอนนี้เกือบ 4 ปีแล้ว ☺
JdeBP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.