Ao escrever esta resposta para outra pergunta e resposta aqui , percebi que o tempo na solução zsh que usa select()
para dormir por um determinado número de centissegundos estava errado em uma quantidade maior do que eu esperava.
Parece que está select()
no meu sistema, cujo tempo limite parece ter um desvio consistente, como se seus segundos valessem 1.001 segundos normais.
$ strace -qqTe /select zsh -c 'zmodload zsh/zselect; zselect -t 6000'
pselect6(0, 0x7ffcee6a9f60, 0x7ffcee6a9fe0, 0x7ffcee6aa060, {tv_sec=60, tv_nsec=0}, NULL) = 0 (Timeout) <60.058930>
$ strace -qqTe /select zsh -c 'zmodload zsh/zselect; zselect -t 600'
pselect6(0, 0x7ffcf2042b70, 0x7ffcf2042bf0, 0x7ffcf2042c70, {tv_sec=6, tv_nsec=0}, NULL) = 0 (Timeout) <6.006212>
$ uname -rs
Linux 6.7.12-amd64
Veja como leva 6,006 segundos com um tempo limite de 6 segundos e 60,06 para um tempo limite de 60 segundos.
Observo o mesmo em hardware diferente e no Ubuntu 22.04 com Linux 6.5.0.
O mesmo com perl
em vez de zsh
:
$ strace -qqTe /select perl -e 'select undef,undef,undef,60'
pselect6(0, NULL, NULL, NULL, {tv_sec=60, tv_nsec=0}, NULL) = 0 (Timeout) <60.060218>
E o mesmo com poll() em vez de select():
$ strace -qqTe /poll perl -MIO::Poll -e 'IO::Poll->new()->poll(6)'
poll([], 0, 6000) = 0 (Timeout) <6.006215>
$ strace -qqTe /poll perl -MIO::Poll -e 'IO::Poll->new()->poll(60)'
poll([], 0, 60000) = 0 (Timeout) <60.060214>
Isso não parece se aplicar a clock_nanosleep()
or alarm()
.
Esse é um problema conhecido? Isso é possivelmente intencional?