次のコードでは、変数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);
}
しかし、私はこれが起こっているのを見ません。1 つの端末で、次のコマンドを実行します。
$ gcc -O3 foo.c && ./a.out
Working ...
Working ...
別の端末で、SIGUSR1 を自分のプログラムに送信します。
$ pkill -USR1 a.out
最初のターミナルの出力は、プログラムのシグナル ハンドラーが呼び出され、while
-loop が終了したことを示しています。
Working ...
Working ...
handler
Exiting ...
$
quit
ではないため、ループの最適化をどのように実証できvolatile
ますか?