cuốn sách gpt4 ai đã làm

c - Về tín hiệu kill và vòng lặp sleep() trong C và linux

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 23:34:33 25 4
mua khóa gpt4 Nike

Tôi đang chạy chương trình C trên Mac OS. Một phần chương trình của tôi như sau. Mã này chạy tốt trên tín hiệu sigint nhưng không thành công với tín hiệu sigkill.

void sigkill(int sig){
/*một số mã bị bỏ qua*/
thoát (0);
}
dấu hiệu void(int sig){
cờ=1;
}

khoảng trống còn sống(void) {
tín hiệu(SIGINT, sigin);
tín hiệu(SIGKILL, sigkill);
báo động(10);
trong khi(1){
//printf("%d\n",flag);
ngủ(1);
nếu(cờ==1){
printf("no\n");
cờ=0;
}
}
}

Tôi có bốn câu hỏi:

  1. Lúc đầu tôi không viết nóngủ(1), nó có thể nhập hàm sigint() và thay đổi giá trị cờ, như có thể thấy từ printf. Tuy nhiên, "không" không xuất ra như tôi mong đợi.

  2. Sau khi tôi thêm chức năng ngủ, nó hoạt động rất tốt. Tôi đoán vòng lặp while sẽ kiểm tra cờ cứ sau 1 giây và nếu cờ = 1 thì xuất ra "không". Tuy nhiên, nó dường như xuất ra "không" mỗi lần tôi nhấn ctrl+c. Tại sao không đợi một giây?

  3. Câu hỏi cho biết "Bạn không nên sử dụng 'ngủ()' để đợi 10 giây. Hãy sử dụng báo thức(), cộng với vòng lặp." Tôi muốn biết cách triển khai nó mà không cần ngủ().

  4. Lệnh kill không gọi được hàm sigkill, giải quyết thế nào?

câu trả lời hay nhất

  1. Nói chung, tín hiệu chỉ có thể được "bắt" khi ứng dụng của bạn thực hiện lệnh gọi hệ thống tới kernel. Nếu bạn thực hiện thường xuyên while(1) { if (flag==1){...} } , nó không bao giờ gọi kernel. Về mặt lý thuyết, khi bạn while(1) Thực hiện bên ngoài vòng lặp printf , nó sẽ gọi kernel để có thể bắt được tín hiệu.
  2. ngủ() Bị gián đoạn bởi bất kỳ tín hiệu nào. Kiểm tra ngủ(3) trang người đàn ông.
  3. Kiểm tra báo động(2) trang người đàn ông.
  4. bạn không thể thay đổi SIGKILL hoặc SIGSTOP bộ xử lý tín hiệu. Các hiệu ứng tín hiệu này được mã hóa cứng vào kernel. từ dấu hiệu(2):

    dấu hiệu chỉ định tín hiệu và có thể là bất kỳ tín hiệu hợp lệ nào ngoại trừ SIGKILL and SIGSTOP.

    không có tham sốgiết Lệnh sẽ không được tạoSIGKILL tín hiệu nó tạo ra SIGTERM.

Về c - Trong C và Linux, liên quan đến tín hiệu kill và vòng lặp sleep(), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/39338347/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress