
正常情况下当发送信号时,程序就会结束,但如果在编译时加入优化选项如-O1,-O2...就不会退出。
但是因为flag的修改是在信号处理函数中修改的而不是main函数,编译器判定flag在循环中没有被修改,因此做出了优化,每次判断!flag时不再把flag从内存中读取到cpu寄存器进行判断,而是直接编译指令为:读取寄存器原来的值进行判断。
而volatile声明的变量,保证每次都会被从内存中拿取而不被优化(即使编译时加了优化选项)****。

正常情况下当发送信号时,程序就会结束,但如果在编译时加入优化选项如-O1,-O2...就不会退出。
但是因为flag的修改是在信号处理函数中修改的而不是main函数,编译器判定flag在循环中没有被修改,因此做出了优化,每次判断!flag时不再把flag从内存中读取到cpu寄存器进行判断,而是直接编译指令为:读取寄存器原来的值进行判断。
而volatile声明的变量,保证每次都会被从内存中拿取而不被优化(即使编译时加了优化选项)****。