ITIMER_VIRTUAL counts CPU time. When your process is sleeping, it’s not using CPU time, so the timer doesn’t run, and won’t expire.
—
setitimer and nanosleep issue.
元質問は、「nanosleepで寝てると、いつまで待ってもsetitimer(ITIMER_VIRTUAL)が発火しないんだけど?(SIGVTALRMが飛んでこないんだけど?)」というもの。引用部分が答え。ITIMER_PROFのSIGPROFならともかく、VIRTUALならシグナルされそうだと思ってしまいがちなので注意(さっきうっかり同じ疑問を抱いた)。カーネル内で仕事をしているならVIRTUALなシグナルは飛んでくるが、カーネル内で寝ている(CPUを使っていない)と飛んでこない。カウントされない。