e$B$5$H$&$U$_$d$9e(B @ OSS e$B%F%/%N%m%8$G$9!#e(B
At Mon, 24 Sep 2007 23:03:27 +0900,
e$B$H$_$?$^$5$R$me(B wrote:
e$B:#$^$G$=$N$h$&$JG’<1$OL5$+$C$?$N$G$9$,!“e(B Solaris10 e$B>e$Ne(B MySQL/Ruby e$B<B9Te(B
e$BCf$Ke(B poll() e$B$,e(B SIGVTALRM e$B$Ge(B EINTR e$B$K$J$C$F<:GT$9$k$H$$$&;v>]$,$”$C$?$He(B
e$B$$$&O"Mm$r<u$1$?$N$G!"$I$&$7$?$b$N$+$H!D!#e(B
e$B:#EYe(B Solaris 10 e$B$Ge(B Ruby e$B$r;n$=$&$H;W$C$F$$$?$N$Ge(B
e$B5$$K$J$C$?$N$G;n$7$F$_$^$7$?!#e(BC e$B$N%=!<%9$O0J2<e(B:
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <poll.h>
#include <errno.h>
#include <sys/time.h>
int sig_vtalrm_count = 0;
void sig_vtalrm(int sig)
{
printf("******** SIGVTALRM (%d) ********\n", sig);
sig_vtalrm_count++;
}
int main(void)
{
struct sigaction sigact;
int i, j;
struct itimerval itime, itime2;
struct pollfd fds[1];
int fd_ready;
int poll_count = 0;
int itime_timeout = 100; /* 100 msec /
int poll_timeout = 1000; / 1000 msec */
sigact.sa_handler = sig_vtalrm;
sigact.sa_flags = 0;
sigaction(SIGVTALRM, &sigact, NULL);
itime.it_interval.tv_sec = itime.it_value.tv_sec = 0L;
itime.it_interval.tv_usec = itime.it_value.tv_usec = itime_timeout *
1000L;
errno = 0;
setitimer(ITIMER_VIRTUAL, &itime, NULL);
printf(“setitimer errno %d (%s)\n”, errno, strerror(errno));
fds[0].fd = 0;
fds[0].events = POLLIN;
for (i = 0; i < 10; i++) {
getitimer(ITIMER_VIRTUAL, &itime2);
printf(“pre poll : gettimer %ld sec, %ld usec\n”,
itime2.it_value.tv_sec, itime2.it_value.tv_usec);
errno = 0;
fd_ready = poll(fds, 1L, poll_timeout);
poll_count++;
printf(“poll fd ready %d\n”, fd_ready);
printf(“poll fd events %x\n”, fds[0].revents);
printf(“poll errno %d (%s)\n”, errno, strerror(errno));
getitimer(ITIMER_VIRTUAL, &itime2);
printf(“post poll: gettimer %ld sec, %ld usec\n”,
itime2.it_value.tv_sec, itime2.it_value.tv_usec);
for (j = 0; j < 0xFFFFFF; j++) {}
}
puts("");
printf(“poll count: %d (%d msec)\n”, poll_count, poll_count *
poll_timeout);
printf(“sigvtalrm count: %d (%d sec)\n”, sig_vtalrm_count,
sig_vtalrm_count * itime_timeout);
return 0;
}
poll(2) e$B$be(B set/getitimer(2) e$B$b=i$a$F;H$&$N$G<+?.$,$J$$e(B
e$B$G$9$,!"$"$C$F$^$9$+$Me(B? e$B%3%s%Q%$%kJ}K!$H<B9T<j=g$Oe(B:
$ /usr/sfw/bin/gcc -Wall a.c && time ./a.out
$ /usr/sfw/bin/gcc -D_REENTRANT -lthread -Wall a.c && time ./a.out
$ /opt/SUNWspro/bin/cc a.c && time ./a.out
$ /opt/SUNWspro/bin/cc -D_REENTRANT -lthread a.c && time ./a.out
$ /opt/SUNWspro/bin/cc -mt a.c && time ./a.out
e$B$$$:$l$b7k2L$O0J2<$N$h$&$K$J$j!"e(Bpoll() e$B$Ge(B EINTR
e$B$OH/@8$7$^$;$s$G$7$?e(B
(SPARC, Intel e$B$H$be(B):
$ /usr/sfw/bin/gcc -Wall a.c && time ./a.out
setitimer errno 0 (Error 0)
pre poll : gettimer 0 sec, 100000 usec
poll fd ready 0
poll fd events 0
poll errno 0 (Error 0)
post poll: gettimer 0 sec, 100000 usec
pre poll : gettimer 0 sec, 40000 usec
poll fd ready 0
poll fd events 0
poll errno 0 (Error 0)
post poll: gettimer 0 sec, 40000 usec
******** SIGVTALRM (28) ********
pre poll : gettimer 0 sec, 100000 usec
poll fd ready 0
poll fd events 0
poll errno 0 (Error 0)
post poll: gettimer 0 sec, 100000 usec
pre poll : gettimer 0 sec, 30000 usec
poll fd ready 0
poll fd events 0
poll errno 0 (Error 0)
post poll: gettimer 0 sec, 30000 usec
******** SIGVTALRM (28) ********
pre poll : gettimer 0 sec, 60000 usec
poll fd ready 0
poll fd events 0
poll errno 0 (Error 0)
post poll: gettimer 0 sec, 60000 usec
*** e$B>JN,e(B ***
poll count: 10 (10000 msec)
sigvtalrm count: 6 (600 sec)
real 0m10.735s
user 0m0.650s
sys 0m0.013s
e$B$3$NJU$K$D$$$FBP=h$7$F$$$k%i%$%V%i%j$r8+$?$3$HL5$$$N$G$9$,!"$I$&$9$k$Ne(B
e$B$,@5$7$$$N$G$7$g$&$+!#e(B
SIGVTALRM e$B$Ge(B poll(2) e$B$,e(B EINTR
e$B$K$J$k$+$I$&$+$O$H$b$+$/!“e(B
poll(2) e$B$Ge(B EINTR e$B$,H/@8$9$k2DG=@-$O$”$k$N$G!"e(B
EINTR e$B$rJdB-$7$F$$$J$$%i%$%V%i%j$,0-$$$s$8$c$J$$$G$7$g$&$+e(B?