nanosleep() - Unix,Linux系統呼叫 - 技術教學
Tutorials Point


  Unix入門
  Unix Shell程式設計
  高階Unix
  Unix有用參考
  Unix有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考文獻     討論論壇     關於TP  

nanosleep() - Unix,Linux系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

nanosleep - 暫停執行指定時間

概要

#define _POSIX_C_SOURCE 199309 #include <time.h>

int nanosleep(const struct timespec *req, struct timespec *rem);

描述

nanosleep() 至少延遲程式執行*req中指定的時間。如果已向程序傳遞訊號,則函式可以提前返回。在這種情況下,它返回 -1,將errno設定為EINTR,並將剩餘時間寫入rem指向的結構體中,除非rem為 NULL。然後可以使用*rem的值再次呼叫nanosleep() 並完成指定的暫停。

timespec結構用於指定具有納秒精度的間隔時間。它在<time.h>中指定,其形式為:

struct timespec {
    time_t tv_sec;        /* seconds */
    long   tv_nsec;       /* nanoseconds */
};

納秒欄位的值必須在 0 到 999999999 範圍內。

sleep(3) 和usleep(3) 相比,nanosleep() 的優勢在於它不會影響任何訊號,它符合 POSIX 標準,它提供更高的計時解析度,並且它允許更容易地繼續被訊號中斷的睡眠。

返回值

如果成功休眠了請求的間隔時間,nanosleep() 返回 0。如果呼叫被訊號處理程式中斷或遇到錯誤,則返回 -1,並設定errno以指示錯誤。

錯誤

標籤描述
EFAULT 從使用者空間複製資訊時出現問題。
EINTR 暫停已被傳遞給程序的非阻塞訊號中斷。剩餘的睡眠時間已寫入 *rem,以便程序可以輕鬆地再次呼叫nanosleep() 並繼續暫停。
EINVAL tv_nsec欄位中的值不在 0 到 999999999 範圍內,或者tv_sec為負。

缺陷

nanosleep() 的當前實現基於普通的核心定時器機制,其解析度為 1/HZ s(參見time(7))。因此,nanosleep() 總是至少暫停指定的時間,但是直到程序再次可執行可能最多需要 10 毫秒的時間。出於同樣的原因,在 *rem 中傳遞訊號時返回的值通常會四捨五入到下一個較大的 1/HZ s 的倍數。

舊行為

為了支援需要更精確暫停的應用程式(例如,為了控制某些時間關鍵型硬體),當從像SCHED_FIFOSCHED_RR這樣的即時策略下排程的程序呼叫nanosleep() 時,它將透過繁忙等待以微秒精度處理最多 2 毫秒的暫停。此特殊擴充套件已在核心 2.5.39 中移除,因此它仍然存在於當前的 2.4 核心中,但不存在於 2.6 核心中。

在 Linux 2.4 中,如果nanosleep() 被訊號(例如,SIGTSTP)停止,則在程序被 SIGCONT 訊號恢復後,呼叫將返回錯誤EINTR。如果隨後重新啟動系統呼叫,則程序在停止狀態下花費的時間將計入睡眠間隔。

符合標準

POSIX.1-2001。

參見



previous next Printer Friendly

廣告


  

廣告



廣告