fork () และสัญญาณถูกส่งไปยังกระบวนการอย่างไร


13

ฉันโปรแกรมที่ฉันเขียนใน C fork () ปิดกระบวนการลูก กระบวนการจะไม่ยุติ ถ้าฉันเปิดโปรแกรมจากบรรทัดคำสั่งและกด control-c กระบวนการใดที่จะได้รับสัญญาณขัดจังหวะ?

คำตอบ:


20

ทำไมเราไม่ลองดูล่ะ ต่อไปนี้เป็นโปรแกรมเล็ก ๆ น้อย ๆ ที่ใช้signal(3)ดักจับSIGINTทั้งกระบวนการผู้ปกครองและเด็กและพิมพ์ข้อความที่ระบุกระบวนการเมื่อมาถึง

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");}
void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");}
int main(int argc, char **argv) {
    if (!fork()) {
        signal(SIGINT, &child_trap);
        sleep(1000);
        exit(0);
    }
    signal(SIGINT, &parent_trap);
    sleep(1000);
    return 0;
}

test.cโทรเถอะว่า ตอนนี้เราสามารถเรียกใช้:

$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!

สัญญาณขัดจังหวะสร้างขึ้นในสถานีที่จะถูกส่งไปยังกลุ่มกระบวนการใช้งานซึ่งที่นี่มีทั้งผู้ปกครองและเด็ก คุณจะเห็นว่าทั้งสองchild_trapและparent_trapถูกประหารชีวิตเมื่อผมกด-CtrlC

มีคือการอภิปรายยาวของการมีปฏิสัมพันธ์ระหว่างforkและสัญญาณใน POSIX วัสดุที่สำคัญที่สุดของที่นี่คือ:

สัญญาณที่ส่งไปยังกลุ่มกระบวนการหลังจาก fork () ควรถูกส่งไปที่ parent และ child

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

ประเด็นที่มีประโยชน์อื่น ๆ ได้แก่ :

  • สัญญาณที่สร้างขึ้นด้วยตนเองและส่งไปยังกระบวนการของแต่ละบุคคล (อาจจะมีkill) จะถูกส่งเท่านั้นที่จะเป็นกระบวนการที่ไม่คำนึงถึงไม่ว่าจะเป็นผู้ปกครองหรือเด็ก
  • ลำดับที่ไม่ได้กำหนดตัวจัดการสัญญาณที่รันระหว่างกระบวนการดังนั้นคุณจึงไม่สามารถพึ่งพาการดำเนินการก่อนได้
  • หากคุณไม่ได้กำหนดตัวจัดการขัดจังหวะ (หรือเพิกเฉยต่อสัญญาณอย่างชัดเจน) กระบวนการทั้งสองจะเพิ่งจบด้วยSIGINTรหัส (พฤติกรรมเริ่มต้น)
  • หากหนึ่งจัดการสัญญาณไม่เป็นอันตรายและอื่น ๆ ไม่ได้อย่างใดอย่างหนึ่งโดยไม่ต้องจัดการจะตายและอื่น ๆ จะดำเนินการต่อ

ฉันคิดว่ากระสุนสามารถรบกวนในวิธีที่น่าสนใจได้หรือไม่ ถ้ามันเป็นสัญญาณว่าพวกเขาสามารถดักจับมันอาจส่งไปให้ลูก ๆ ของมันได้หรือ (และจากนั้นก็มี SIGHUP) (ทั้งหมดนี้อาจหมายถึงว่าในขณะที่ระบบปฏิบัติการไม่ส่งสัญญาณกระบวนการลูกอาจไม่ได้รับผลกระทบจากสัญญาณไปยังผู้ปกครอง ... )
Gert van den Berg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.