代碼在第一問題(最小化的情況下):printf的是不是在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;
}
我運行的代碼,它循環,因爲它應該,在另一個殼打印出0。然後..
kill -s SIGINFO <pid_of_my_process>
信號傳遞,c
遞增..但fprintf
不會發生。
這是爲什麼?處理程序代碼在什麼環境/上下文中運行?我在哪裏可以讀到這個?
嘗試使用'fflush(stderr)'刷新stderr' – Saphrosit 2012-03-03 17:04:46
不要使用printf()et.al.內部信號處理程序。他們不是信號安全的(例如:可以調用malloc(),這不是信號安全的) – wildplasser 2012-03-03 17:05:35
有趣的是,我可以發誓我在發佈之前曾嘗試過一個帶'fflush'的變體。要麼從不重新編譯並運行,要麼通過無限循環將屏幕上的消息移出腳部。如此無語和愚蠢。 – ntl0ve 2012-03-03 18:43:36