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