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


  Unix初學者教程
  Unix Shell程式設計
  高階Unix
  Unix有用參考
  Unix有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考資料     討論區     關於TP  

getitimer() - Unix,Linux系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

getitimer, setitimer - 獲取或設定間隔計時器的值

概要

#include <sys/time.h> 

int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

描述

系統為每個程序提供三個間隔計時器,每個計時器在不同的時間域中遞減。當任何計時器到期時,都會向程序傳送訊號,並且計時器(可能)會重新啟動。
標籤描述
ITIMER_REAL 以即時遞減,到期時傳送SIGALRM訊號。
ITIMER_VIRTUAL 僅在程序執行時遞減,到期時傳送SIGVTALRM訊號。
ITIMER_PROF 在程序執行和系統代表程序執行時都遞減。與ITIMER_VIRTUAL結合使用時,此計時器通常用於分析應用程式在使用者空間和核心空間中花費的時間。到期時傳送SIGPROF訊號。
計時器值由以下結構定義

struct itimerval { struct timeval it_interval; /* next value */ struct timeval it_value; /* current value */ }; struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ };

函式getitimer() 使用value指示的結構填充由whichITIMER_REALITIMER_VIRTUALITIMER_PROF之一)指示的計時器的當前設定。元素it_value設定為計時器上剩餘的時間量,如果計時器已停用,則為零。類似地,it_interval設定為重置值。函式setitimer() 將指示的計時器設定為value中的值。如果ovalue非零,則舊的計時器值將儲存在那裡。

計時器從it_value遞減到零,生成訊號,然後重置為it_interval。設定為零的計時器(it_value為零或計時器到期且it_interval為零)將停止。

tv_sectv_usec在確定計時器的持續時間方面都很重要。

計時器永遠不會在請求時間之前到期,但可能會在之後的一段時間(很短)到期,這取決於系統計時器解析度和系統負載。(但請參見下面的錯誤。)到期時,將生成訊號並重置計時器。如果計時器在程序活動時到期(對於ITIMER_VIRTUAL始終為真),則在生成時會立即傳遞訊號。否則,傳遞將被延遲一小段時間,這取決於系統負載。

返回值

成功時,返回零。出錯時,返回-1,並相應設定errno

錯誤

標籤描述
EFAULT valueovalue不是有效的指標。
EINVAL which不是ITIMER_REALITIMER_VIRTUALITIMER_PROF之一。

備註

透過fork(2)建立的子程序不會繼承其父程序的間隔計時器。間隔計時器在execve(2)中得以保留。

符合標準

POSIX.1-2001, SVr4, 4.4BSD(此呼叫首次出現在4.2BSD中)。

參見

訊號的生成和傳遞是不同的,並且每個程序可能只有一個上述訊號的例項處於掛起狀態。在負載非常大的情況下,ITIMER_REAL計時器可能在先前到期訊號傳遞之前到期。在這種情況下,第二個訊號將丟失。

在Linux上,計時器值以jiffies表示。如果請求設定一個計時器,其jiffies表示超過MAX_SEC_IN_JIFFIES(在include/linux/jiffies.h中定義),則計時器將靜默截斷到此上限值。在Linux/x86上(自從核心2.6.13以來,預設的jiffy為0.004秒),這意味著計時器的上限值大約為99.42天。

在某些系統(包括x86)上,2.6.12版本之前的Linux核心存在一個錯誤,在某些情況下會提前最多一個jiffy導致計時器到期。此錯誤已在2.6.12核心中修復。

POSIX.1-2001指出,如果指定的tv_usec值超出0到999999的範圍,則setitimer()應該失敗。但是,Linux不會報錯,而是會靜默調整計時器的相應秒數值。將來(計劃於2007年3月),這種不符合標準的情況將得到修復:現有的應用程式現在應該進行修復,以確保它們提供正確格式的tv_usec值。


previous next Printer Friendly

廣告


  

廣告



廣告