ฉันโปรแกรมที่ฉันเขียนใน C fork () ปิดกระบวนการลูก กระบวนการจะไม่ยุติ ถ้าฉันเปิดโปรแกรมจากบรรทัดคำสั่งและกด control-c กระบวนการใดที่จะได้รับสัญญาณขัดจังหวะ?
ฉันโปรแกรมที่ฉันเขียนใน C fork () ปิดกระบวนการลูก กระบวนการจะไม่ยุติ ถ้าฉันเปิดโปรแกรมจากบรรทัดคำสั่งและกด control-c กระบวนการใดที่จะได้รับสัญญาณขัดจังหวะ?
คำตอบ:
ทำไมเราไม่ลองดูล่ะ ต่อไปนี้เป็นโปรแกรมเล็ก ๆ น้อย ๆ ที่ใช้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
รหัส (พฤติกรรมเริ่มต้น)