在下面的代码中,我没有使变量quit
has volatile sig_atomic_t
。我把它作为一个平原int
。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#define UNUSED(x) (void) (x)
int quit;
void sigusr1_handler(int sig)
{
UNUSED(sig);
write(1, "handler\n", 8);
quit = 1;
}
int main()
{
struct sigaction sa;
sa.sa_handler = sigusr1_handler;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGUSR1, &sa, NULL) == -1) {
perror("sigaction");
return 1;
}
quit = 0;
while (!quit) {
printf("Working ...\n");
sleep(1);
}
printf("Exiting ...\n");
return 0;
}
由于该quit
变量未指定为volatile
,因此我期望编译器的优化器会将while
代码中的 -loop 优化为:
while (1) {
printf("Working ...\n");
sleep(1);
}
但我不认为这会发生。在一个终端上,我运行以下命令。
$ gcc -O3 foo.c && ./a.out
Working ...
Working ...
在另一个终端上,我将 SIGUSR1 发送到我的程序。
$ pkill -USR1 a.out
在第一个终端上,输出显示程序的信号处理程序被调用并且while
-loop 退出。
Working ...
Working ...
handler
Exiting ...
$
quit
由于不存在,我如何证明循环的优化volatile
?