[comp.unix.questions] sleep

BACON@MTUS5.BITNET (Jeffery Bacon) (12/15/89)

Given sleep(arg); unsigned arg. Nothing new.
But what if you want to sleep for less than one second, say, 0.5?
(Why isn't terribly important here.)

(Please email replies; I don't read comp.lang.c much, and I'm behind in my
reading anyway...thanx.)
-------
Jeffery Bacon -- Computing Technology Svcs., Michigan Technological University
email- bacon@mtus5.bitnet       voice: (906)487-2110        fax: (906)487-2787
alternate-  uucp: <world>!itivax!anet!bacos  domain: bacos%anet@itivax.iti.org

peter@sersun1.essex.ac.uk (Allott P) (12/19/89)

In article <89348.231211BACON@MTUS5.BITNET> BACON@MTUS5.BITNET (Jeffery Bacon) writes:
>Given sleep(arg); unsigned arg. Nothing new.
>But what if you want to sleep for less than one second, say, 0.5?

It is possible to "sleep" for less than one second by doing a
selcect(.......) with an appropriate value in the timeval (5th param I think)
and with no channels to check (2nd through 4th params I think).
See the documentation for full details.

davidsen@crdos1.crd.ge.COM (Wm E Davidsen Jr) (12/20/89)

In article <2754@servax0.essex.ac.uk> peter@essex.ac.uk (Allott P) writes:

| It is possible to "sleep" for less than one second by doing a
| selcect(.......) with an appropriate value in the timeval (5th param I think)
| and with no channels to check (2nd through 4th params I think).
| See the documentation for full details.

  Correct. There are also vendor dependent routines in other versions.
Common names are mspeel (in ms), usleep (in us, but clock tick
resolution), and nap (ms again).

  nap is xenix and 5.3.2 and later, uspeep is SunOS and some others,
don't know where msleep is from, got some source with
	msleep(50); /* wait 50 ms */
in it, so I know it's out there somewhere. nap and select are your best
bets for portability. I *think* there's a version of nap for BSD, but I
don't have it here.
-- 
bill davidsen	(davidsen@crdos1.crd.GE.COM -or- uunet!crdgw1!crdos1!davidsen)
"The world is filled with fools. They blindly follow their so-called
'reason' in the face of the church and common sense. Any fool can see
that the world is flat!" - anon

marc@tekig3.PEN.TEK.COM (Marc Frajola) (12/20/89)

In article <2754@servax0.essex.ac.uk> peter@essex.ac.uk (Allott P) writes:
>In article <89348.231211BACON@MTUS5.BITNET> BACON@MTUS5.BITNET (Jeffery Bacon) writes:
>>Given sleep(arg); unsigned arg. Nothing new.
>>But what if you want to sleep for less than one second, say, 0.5?
>
>It is possible to "sleep" for less than one second by doing a
>selcect(.......) with an appropriate value in the timeval (5th param I think)
>and with no channels to check (2nd through 4th params I think).
>See the documentation for full details.

Hi...

    Some time ago, I was posed with the problem of doing the equivalent
of nap() on BSD. Since SysV had nap(), I decided to implement nap()
with BSD primitives. I've used it in one of my programs for the last
two years without problems (so it is SOMEWHAT tested). I distribute it
in nap.c and only compile it on BSD systems; SysV already has nap()
somewhere in a library.

    Following is my version of nap() -- please e-mail me if you make
useful enhancements/changes... Bon Appetit!

...Marc...
--
Marc Frajola, Tektronix Inc., Beaverton, OR
Phone: (503) 627-4340 (Tek) or (503) 643-5203 (Home)
InterNet-Style Address: marc@tekig3.PEN.TEK.COM
UUCP: ..!tektronix.TEK.COM!tekig3.PEN.TEK.COM!marc (Tek - Lab Scopes)
      ..!tektronix.TEK.COM!tessi.UUCP!escargot!marc (Home System e-mail)

---------- Cut here for 'nap.shar' -------------------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	nap.c
# This archive created: Tue Dec 19 15:39:41 1989
export PATH; PATH=/bin:$PATH
echo shar: extracting "'nap.c'" '(2496 characters)'
if test -f 'nap.c'
then
	echo shar: will not over-write existing file "'nap.c'"
else
sed 's/^X//' << \SHAR_EOF > 'nap.c'
X/*
X * Implementation of System-V style nap() on BSD Unix (4.2 and after)
X *
X * Copyright (C) 1987, 1988, 1989 by Marc A. Frajola
X *
X * Permission to use, copy, modify, and distribute this software and
X * its documentation for any purpose and without fee is hereby
X * granted, provided that the above copyright notice appear in all
X * copies and that both that copyright notice and this permission
X * notice appear in supporting documentation. This software is
X * provided "as is" without express or implied warranty.
X *
X * The nap() function under SysV may be implemented quite differently,
X * but the idea here is to delay a specified number of milliseconds
X * since sleep()'s granularity is only every second.
X *
X * This code is provided here is for BSD, and will function ONLY on a
X * 4.2bsd or later UNIX system.
X *
X * WARNING: This function will blow away any previous alarm setting if
X * the alarm() function uses setitimer().
X *
X * By Marc A. Frajola, 08/20/87
X *
X * $Header: nap.c,v 1.6 89/12/19 14:21:33 marc Exp $
X */
X
X#include <sys/time.h>
X#include <signal.h>
X
Xstatic int napwakeup();		/* Forward reference for wakeup function */
Xstatic int napdone;		/* Flag if nap() call is done */
X
X/*
X * Function for emulating System-V like nap() behavior using BSD
X * setitimer()
X */
Xnap(msec)
X    int msec;			/* Number of milliseconds to nap */
X{
X    struct itimerval value;	/* Timer value structure for setitimer() */
X    long usec;			/* Number of microseconds before alarm */
X    int (*oldsig)();		/* Old signal condition */
X
X    /* Set the timer reload values for no followup SIGALRMs: */
X    value.it_interval.tv_sec = 0;
X    value.it_interval.tv_usec = 0;
X
X    /* Set the current timer for the desired number of milliseconds: */
X    usec = msec * 1000;
X    value.it_value.tv_sec = msec / 1000;
X    value.it_value.tv_usec = usec % 1000000;
X
X    /*
X     * Set the timer, done flags, and wakeup procedure:
X     */
X    napdone = 0;
X    oldsig = signal(SIGALRM, napwakeup);
X    if (setitimer(ITIMER_REAL, &value, (struct itimerval *)0) < 0) {
X	perror("setitimer");
X	return;
X    }
X
X    /* Block the process until a SIGALRM comes in: */
X    do {
X	pause();
X    } while (napdone != 1);
X
X    /* Reset signal() state back to original condition: */
X    signal(SIGALRM, oldsig);
X
X    return;
X}
X
X/*
X * This function only gets executed so that pause() will unblock the
X * process.
X */
Xstatic
Xnapwakeup()
X{
X    /* Set flag so nap() knows the SIGALRM has actually come in: */
X    napdone = 1;
X
X    return;
X}
SHAR_EOF
if test 2496 -ne "`wc -c < 'nap.c'`"
then
	echo shar: error transmitting "'nap.c'" '(should have been 2496 characters)'
fi
fi # end of overwriting check
#	End of shell archive
exit 0

wozniak@utkux1.utk.edu (Bryon Lape) (12/21/89)

	I wrote a sleep() function for Quick C that will go less than
one
second, but I am not sure how far down,


-bryon-

prc@erbe.se (Robert Claeson) (12/21/89)

In article <2754@servax0.essex.ac.uk>, peter@sersun1.essex.ac.uk (Allott P) writes:
> In article <89348.231211BACON@MTUS5.BITNET> BACON@MTUS5.BITNET (Jeffery Bacon) writes:

> >Given sleep(arg); unsigned arg. Nothing new.
> >But what if you want to sleep for less than one second, say, 0.5?

> It is possible to "sleep" for less than one second by doing a
> selcect(.......) with an appropriate value in the timeval (5th param I think)
> and with no channels to check (2nd through 4th params I think).

The same trick can be done under UNIX System V Release 3.x using the poll()
system call with appropriate values and no stream fd's to check.

-- 
          Robert Claeson      E-mail: rclaeson@erbe.se
	  ERBE DATA AB

guy@auspex.auspex.com (Guy Harris) (12/21/89)

>    Some time ago, I was posed with the problem of doing the equivalent
>of nap() on BSD.

The equivalent of "nap" in 4.3BSD is "usleep", and comes with the
system.  In 4.2BSD, you can either use "setitimer" etc. as you've done,
or you can use "select".

>Since SysV had nap(),

Correction.  *Some* versions of System V *may* have "nap()"; I don't
think it's universally available.  In System V Release 3, you may be
able to use "poll" in much the same way you use "select" in 4.2BSD.

BACON@MTUS5.BITNET (Jeffery Bacon) (12/21/89)

Thanks one and all for all the replies. Turns out I totally skipped over
the usleep() man page; thought it was yet another sleep() for some reason.
I feel stupid now. (But that's nothing new.)
-------
Jeffery Bacon -- Computing Technology Svcs., Michigan Technological University
email- bacon@mtus5.bitnet       voice: (906)487-2110        fax: (906)487-2787
alternate-  uucp: <world>!itivax!anet!bacos  domain: bacos%anet@itivax.iti.org