sleep - General: Puts a calling process to sleep
void sleep(
caddr_t *channel,
long pri );
Specifies a unique address associated with the calling
kernel thread to be put to sleep. Specifies whether the
sleep request is interruptible. Setting this argument to
the PCATCH flag causes the process to sleep in an interruptible
state (that is, the kernel thread can take asynchronous
signals). Not setting the PCATCH flag causes the
process to sleep in an uninterruptible state (that is, the
kernel thread cannot take asynchronous signals).
The sleep routine puts a calling process to sleep on the
address specified by the channel argument. Some common
addresses are the lbolt argument, a buf structure, and a
proc structure. This address should be unique to prevent
unexpected wake/sleep cycles, which can occur if different
processes are sleeping on the same address accidentally.
If you set the PCATCH flag in the pri argument, the sleep
routine puts signals on the queue and does not wake up the
sleeping process.
The sleep and wakeup routines block and then wake up a
process. Generally, device drivers call these routines to
wait for the transfer to complete an interrupt from the
device. That is, the write routine of the device driver
sleeps on the address of a known location, and the
device's Interrupt Service Interface (ISI) wakes the process
when the device interrupts. It is the responsibility
of the wakened process to check if the condition for which
it was sleeping has been removed.
The operating system provides two ways to put a process to
sleep: interruptible and uninterruptible. The sleep routine
performs an uninterruptible sleep operation if you do
not set the PCATCH flag and an interruptible sleep operation
if you set the PCATCH flag. This means that device
drivers cannot call sleep at interrupt context because at
interrupt context there is no calling process to be put to
sleep. Thus, a device driver's Interrupt Service Interface
(ISI) and those routines called from within the ISI must
not call the sleep routine.
On this operating system, you cannot use pri to set the
scheduling priority of the calling process.
None
SEE ALSO
Routines: wakeup(9r)
sleep(9r)
[ Back ] |