Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Apr 1999 13:40:35 +0200
From:      Graham Wheeler <gram@cdsec.com>
To:        hackers@freebsd.org
Subject:   Re: Using select() to implement a delay
Message-ID:  <371C67B3.1E7CE39A@cdsec.com>
References:  <3.0.6.32.19990420112535.007d27d0@192.168.255.1>

next in thread | previous in thread | raw e-mail | index | archive | help
Bob Bishop wrote:
> 
> Hi,
> 
> Most likely your select() is taking a signal; truss might be

It was indeed SIGCHLDs that were causing the problem.

> should in theory be able to write something along the lines of:
> 
>         do
>                 r = select(0, 0, 0, 0, &tv);
>         while (r == -1 && errno == EINTR);
> 
> but AFAIK tv won't get updated correctly, see the BUGS entry in select(2).

I am now using:

void Sleep(int sec_dlay, int usec_dlay)
{
    struct timeval tv;
    if (sec_dlay > 0)
    {
        time_t start = time(0);
        // We do this in a loop to be signal-resilient
        for (;;)
        {
            tv.tv_sec = sec_dlay - (time(0) - start);
            if (tv.tv_sec <= 0) break;
            tv.tv_usec = 0;
            (void)select(0, 0, 0, 0, &tv);
        }
    }
    if (usec_dlay > 0) // we don't worry about signals for usecs
    {
        tv.tv_sec = 0;
        tv.tv_usec = usec_dlay;
        (void)select(0, 0, 0, 0, &tv);
    }
}

and all is well.
   
-- 
Dr Graham Wheeler                          E-mail: gram@cdsec.com
Citadel Data Security                      Phone:  +27(21)423-6065/6/7
Firewalls/Virtual Private Networks         Fax:    +27(21)24-3656
Internet/Intranet Network Specialists      
Data Security Products                     WWW:    http://www.cdsec.com/


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?371C67B3.1E7CE39A>