Mã trong câu hỏi đầu tiên (hạn chế tối đa trường hợp):printf không hoạt động trong xử lý tín hiệu C
#include <stdio.h>
#include <signal.h>
int counter = 0;
void react_to_signal(int n) {
fprintf(stderr, "Caught!\n");
counter++;
}
int main(int argc, char** argv) {
signal(SIGINFO, react_to_signal);
while (1) {
printf("%d\n", counter);
}
return 0;
}
tôi chạy mã này, nó vòng như mong muốn, in ra 0. Sau đó, trong vỏ khác ..
kill -s SIGINFO <pid_of_my_process>
Tín hiệu được phân phối, c
được tăng lên .. nhưng fprintf
không xảy ra.
Tại sao lại như vậy? Trong môi trường/bối cảnh nào mã xử lý chạy? Tôi có thể đọc về điều này ở đâu?
Cố gắng làm sạch tiêu bản bằng cách sử dụng 'fflush (stderr)' – Saphrosit
Không sử dụng printf() et.al. bên trong xử lý tín hiệu. Họ không phải là tín hiệu an toàn (ví dụ: có thể gọi malloc(), không an toàn tín hiệu) – wildplasser
Thật thú vị, tôi có thể thề rằng tôi đã thử một biến thể với 'fflush' trước khi tôi đăng. Không bao giờ được biên dịch lại và chạy, hoặc tự bắn vào chân với vòng lặp vô hạn di chuyển màn hình khỏi màn hình. Vì vậy, unromantic và câm. – ntl0ve