Tôi lập trình rằng tôi đã viết trong C fork () tắt một tiến trình con. Không quá trình sẽ chấm dứt. Nếu tôi khởi chạy chương trình từ dòng lệnh và nhấn control-c, quá trình nào sẽ nhận được tín hiệu ngắt?
Tôi lập trình rằng tôi đã viết trong C fork () tắt một tiến trình con. Không quá trình sẽ chấm dứt. Nếu tôi khởi chạy chương trình từ dòng lệnh và nhấn control-c, quá trình nào sẽ nhận được tín hiệu ngắt?
Câu trả lời:
Tại sao chúng ta không thử và xem? Đây là một chương trình tầm thường sử dụng signal(3)
để bẫy SIGINT
trong cả quá trình cha mẹ và con cái và in ra một thông báo xác định quá trình khi nó đến.
#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;
}
Hãy gọi nó là test.c
. Bây giờ chúng ta có thể chạy nó:
$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!
Các tín hiệu ngắt được tạo trong thiết bị đầu cuối được gửi đến nhóm quy trình hoạt động, ở đây bao gồm cả cha mẹ và con cái . Bạn có thể thấy rằng cả hai child_trap
và parent_trap
được thực thi khi tôi nhấn Ctrl- C.
Có một cuộc thảo luận dài về sự tương tác giữa fork
và tín hiệu trong POSIX . Phần vật chất nhất của nó ở đây là:
Một tín hiệu được gửi đến nhóm quy trình sau ngã ba () sẽ được gửi đến cả cha mẹ và con.
Họ cũng lưu ý rằng một số hệ thống có thể không hoạt động chính xác theo cách chính xác, đặc biệt khi tín hiệu đến rất gần với thời điểm fork()
. Tìm hiểu xem bạn đang ở một trong những hệ thống đó có lẽ sẽ yêu cầu đọc mã hoặc rất nhiều may mắn, bởi vì các tương tác rất khó xảy ra trong mỗi lần thử.
Các điểm hữu ích khác là:
kill
) sẽ được cung cấp chỉ với quá trình đó, bất kể cho dù đó là cha mẹ hoặc con.SIGINT
mã (hành vi mặc định).