A. linux實時時間 xtime怎麼獲取並使用
RTC時間操作:
1.rtc時間是由rtc硬體控制的,所以在linux中想要修改和獲取rtc時間就只能通過驅動的介面來獲取和修改。
intrtc_test(void)
{
structrtc_timertc;
intfd=-1;
intret=-1;
fd=open("/dev/rtc0",O_RDWR);
if(fd<0){
return-1;
}
ret=ioctl(fd,RTC_RD_TIME,&rtc);
if(ret<0){
return-1;
}
printf(" CurrentRTCdata/timeis%d-%d-%d,%02d:%02d:%02d. ",rtc.tm_mday,rtc.tm_mon+1,
rtc.tm_year+1900,rtc.tm_hour,rtc.tm_min,rtc.tm_sec);
ret=ioctl(fd,RTC_SET_TIME,&rtc);
if(ret<0){
return-1;
}
return0;
}
2.除了上面這種方式操作rtc時間以外,linux中也有一個命令可以簡化rtc時間操作,hwclock,比如,可以通過system("hwclock-w");系統調用來把xtime設置到rtc硬體。
牆上時間(realtime、xtime):
linux系統中主要使用的就是xtime,它是系統運行的基礎,很多程序都是依賴於xtime來運行的,接下來將介紹將如何操作xtime。
1.獲取、設置微秒級別的時間:
#include
#include
structtimeval
{
inttv_sec;
inttv_usec;
};
intgettimeofday(structtimeval*tv,structtimezone*tz);
intsettimeofday(conststructtimeval*tv,conststructtimezone*gz);
功能描述:
gettimeofday()獲取當前時間,有tv指向的結構體返回。
settimeofday()把當前時間設成由tv指向的結構體數據。當前地區信息則設成tz指向的結構體數據。
2.獲取秒級別的時間
typedeflongtime_t;
time_ttime(time_t*t);
如果t是non-null,它將會把時間值填入t中
3.內核2.6版本後新增的clockapi介面
獲取納秒級別的時間
structtimespec{
time_ttv_sec;/*秒s*/
longtv_nsec;/*納秒ns*/
};
intclock_getres(clockid_tclk_id,structtimespec*res);
intclock_gettime(clockid_tclk_id,structtimespec*tp);
intclock_settime(clockid_tclk_id、conststructtimespec*tp);
編譯連接時採用-lrt才能編譯通過。
clk_id可選參數:
CLOCK_REALTIME
系統全局的實時時鍾.設置此時鍾需要合適的許可權.
CLOCK_MONOTONIC
只能被讀取,無法被設置,表示monotonic時間起點.
CLOCK_PROCESS_CPUTIME_ID
從cpu每進程的高解析度計時器.
CLOCK_THREAD_CPUTIME_ID
線程的特定cpu時間時鍾.
系統啟動時,會首先從rtc中讀取rtc時間,並設置給xtime,而當ntp對系統時間進行更新時,首先設置xtime,然後調用hwclock設置到rtc硬體中。xtime根據需要的精度,可以通過上面幾個介面來選擇使用。
B. linux環境中的sleep和setitimer計時器會不會沖突
如果你是擔心多次alarm調用問題,那就不必擔心。
APUE上在介紹alarm函數時專門寫了專一個sleep事例函數。
現在所屬用的sleep函數是做了這方面的考慮的。
「如果調用者已設置了鬧鍾,則它被s l e e p 1函數中的第一次a l a r m調用擦去。
可用下列方法更正這一點:檢查第一次調用a l a r m的返回值,如其小於本次調用a l a r m的參數值,則只應等到該前次設置的鬧鍾時間超時。如果前次設置鬧鍾時間的超時時刻後於本次設
置值,則在s l e e p 1函數返回之前,再次設置鬧鍾時間,使其在預定時間再發生超時。」
C. Linux系統編程的內容簡介
在某些時刻,幾乎所有的程序員都要與其程序所處操作系統中的系統調用和程序庫打交道。本書主要討論如何編寫Linux系統軟體——代碼位於底層,並且直接跟內核及核心系統程序庫對話。《Linux系統編程》描述了使用標准介麵包括使用Linux獨有的高級介面時,在功能和性能之間如何進行權衡取捨的策略。
本書主題包括:
· 讀寫文件以及其他文件I/O操作,包括Linux內核如何實現和管理文件I/O,內存映射與優化技術
· 進程管理的系統調用,包括實時進程
· 文件與目錄——創建、移動、復制、刪除和管理
· 內存管理——內存分配介面,管理內存,以及優化內存訪問
· 信號及其在Unix系統中的角色,以及基本和高級信號介面
· 時間、休眠和時鍾管理,從基礎開始講述,並且涵蓋POSIX時鍾和高精度計時器
擁有《Linux系統編程》,你將從理論和應用的角度深入了解Linux,可以最大限度地利用系統的潛能。
D. Linux編程itimerval計時器結構體問題
樓主的程序沒有用 signal 注冊 SIGPROC 對應函數,在 for 循環的時候可能已經發生了多次中斷和重置計時器。至於比1秒大,手冊中有解釋 Timers will never expire before the requested time, but may expire some (short) time afterward, which depends on the system timer resolution and on the system load; see time(7).
要在1秒間隔調用一個函數,需要加上 signal,比如
#include<signal.h>
#include<sys/time.h>
#include<stdio.h>
#include<time.h>
staticstructitimervala;
voidtimeover(intevent)
{
structitimervalb;
printf("timeoverat%ld ",time(NULL));
getitimer(ITIMER_PROF,&b);
printf("sec=%ld,usec=%ld ",b.it_value.tv_sec,b.it_value.tv_usec);
}
intmain()
{
signal(SIGPROF,timeover);
printf("beginat%ld ",time(NULL));
a.it_interval.tv_sec=1;
a.it_interval.tv_usec=0;
a.it_value.tv_sec=1;
a.it_value.tv_usec=0;
setitimer(ITIMER_PROF,&a,NULL);
while(1);
return0;
}
E. c語言中怎麼設置計時器
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
clock_t start = clock();
//do some process here
clock_t end = (clock() - start)/CLOCKS_PER_SEC;
cout<<"time comsumption is "<<end<<endl;
}
(5)linux系統編程計時器擴展閱讀
使用linux的系統設置計時器
#include <sys/time.h>
int main()
{
timeval starttime,endtime;
gettimeofday(&starttime,0);
//do some process here
gettimeofday(&endtime,0);
double timeuse = 1000000*(endtime.tv_sec - starttime.tv_sec) + endtime.tv_usec - startime.tv_usec;
timeuse /=1000;//除以1000則進行毫秒計時,如果除以1000000則進行秒級別計時,如果除以1則進行微妙級別計時
}
timeval的結構如下:
strut timeval
{
long tv_sec; /* 秒數 */
long tv_usec; /* 微秒數 */
};
F. linux手冊翻譯——timerfd_create(2)
timerfd_create, timerfd_settime, timerfd_gettime - timers that notify via file descriptors
這些系統調用創建並操作一個計時器,計時器通過文件描述符來通知計時到期,這樣就可以通過 select(2)、poll(2) 和 epoll(7) 監視文件描述符從而監聽計時器。
這三個系統調用的使用類似於 timer_create(2)、timer_settime(2) 和 timer_gettime(2) 。 (沒有與timer_getoverrun(2) 類似的系統調用,因為該功能由 read(2) 提供,如下所述。)
int timerfd_create(int clockid, int flags);
timerfd_create() 創建一個新的計時器對象,並返回引用該計時器的文件描述符。 clockid 參數指定使用那種類型的時鍾(clock)來實現計時器(timer),並且必須是以下之一:
有關上述時鍾的更多詳細信息,請參閱clock_getres(2)。
可以使用clock_gettime(2) 獲取每個時鍾的當前值。
從 Linux 2.6.27 開始,可以在標志中對以下值進行廳局轎按位 OR 運算以更改 timerfd_create() 的行為:
在 2.6.26 及包括 2.6.26 的 Linux 版本中,標志必須指定為零。
int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);
timerfd_settime() arms (starts) or disarms (stops) the timer referred to by the file descriptor fd.
new_value 參數指定計時器的初始到期時間和到期間隔(換句話說,計時器開始執行後,將會在到達初始到期時間時報告一次,此後每過一個到期間隔就會報告一次)。 用於此參數的 itimerspec 結構包含兩個欄位,每個欄位又是一個 timespec 類型的結構:
new_value.it_value 指定計時器的初始到期時間,以秒和納秒為單位。 將 new_value.it_value 的任一欄位設置為非零值,即可啟動計時器。 將 new_value.it_value 的兩個欄位都設置為零會解除定時器。
將 new_value.it_interval 的一個或兩個欄位設置為非零值指定初始到期後重復計時器到期的時間段(以秒和納秒為單位)。 如果 new_value.it_interval 的兩個欄位都為零,則計時器僅在 new_value.it_value 指定的時間到期一次。
如果將 new_value 設置為(10S,2S),即表示,計時器啟動後,將會在扮肆10S後報告一次,然後每隔2S報告一次;
如果將 new_value 設置為(10S,0S),即表示,計時器啟動後,將會在10S後報告一次,然後就不再報告了;
如果將 new_value 修改為(0S,0S),即表示,停止計時。臘枝
默認情況下, new_value 中指定的初始到期時間是相對於調用時計時器時鍾上的當前時間的(即,new_value.it_value 是相對於 clockid 指定的時鍾的當前值設置的)。 可以通過 flags 參數指定使用絕對時間。
flags 參數是一個位掩碼,可以包含以下值:
如果 old_value 參數不為 NULL,則它指向的 itimerspec 結構用於返回調用時當前計時器的設置; 請參閱下面的 timerfd_gettime() 說明。
int timerfd_gettime(int fd, struct itimerspec *curr_value);
timerfd_gettime() 在 curr_value 中返回一個 itimerspec 結構,該結構包含文件描述符 fd 所引用的計時器的當前設置。
it_value 欄位返回計時器下一次到期之前的時間量。 如果此結構的兩個欄位都為零,則定時器當前已解除。 無論在設置計時器時是否指定了 TFD_TIMER_ABSTIME 標志,該欄位始終包含一個相對值。
it_interval 欄位返回定時器的間隔。 如果此結構的兩個欄位都為零,則計時器設置為僅在 curr_value.it_value 指定的時間到期一次。
timerfd_create() 返回的文件描述符支持以下附加操作:
在 fork(2) 之後,子進程繼承了 timerfd_create() 創建的文件描述符的副本。 文件描述符引用與父級中相應文件描述符相同的底層計時器對象,子級中的 read(2) 將返回有關計時器到期的信息。
A file descriptor created by timerfd_create() is preserved across execve(2), and continues to generate timer expirations if the timer was armed.
成功時, timerfd_create() 返回一個新的文件描述符。 出錯時,返回 -1 並設置 errno 以指示錯誤。
timerfd_settime() 和 timerfd_gettime() 成功返回 0; 出錯時返回 -1,並設置 errno 以指示錯誤。
timerfd_create() can fail with the following errors:
timerfd_settime() and timerfd_gettime() can fail with the following errors:
timerfd_settime() can also fail with the following errors:
These system calls are available on Linux since kernel 2.6.25.
Library support is provided by glibc since version 2.8.
These system calls are Linux-specific.
假設在使用 timerfd_create() 創建的 CLOCK_REALTIME 或 CLOCK_REALTIME_ALARM 計時器時,發生以下場景:
在這種情況下,會發生以下情況:
目前,timerfd_create() 支持的時鍾 ID 類型少於 timer_create(2)。
以下程序創建一個 基於實時時鍾的絕對時間 的計時器,然後監控其進度。 該程序最多接受三個命令行參數。 第一個參數指定計時器初始到期的秒數。 第二個參數指定計時器的間隔,以秒為單位。 第三個參數指定程序在終止前應允許計時器到期的次數。 第二個和第三個命令行參數是可選的。
以下 shell 會話演示了該程序的使用:
G. linux定時任務
linux定時任務使用crontab命令
crontab命令說明
crontab命令被用來提交和管理用戶的需要周期性執行的任務,與windows下的計劃任務類似,當安裝完成操作系統後,默認會安裝此服務工具,並且會自動啟動crond進程,crond進程每分鍾會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。
語法
crontab(選項)(參數)
選項
-e:編輯該用戶的計時器設置;
-l:列出該用戶的計時器設置;
-r:刪除該用戶的計時器設置;
-u<用戶名稱>:指定要設定計時器的用戶名稱。
參數
crontab文件:指定包含待執行任務的crontab文件。
知識擴展
Linux下的任務調度分為兩類:系統任務調度和用戶任務調度。
系統任務調度:系統周期性所要執行的工作,比如寫緩存數據到硬碟、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。
/etc/crontab文件包括下面幾行:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/
# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前四行是用來配置crond任務運行的環境變數,第一行SHELL變數指定了系統要使用哪個shell,這里是bash,第二行PATH變數指定了系統執行命令的路徑,第三行MAILTO變數指定了crond的任務執行信息將通過電子郵件發送給root用戶,如果MAILTO變數的值為空,則表示不發送任務執行信息給用戶,第四行的HOME變數指定了在執行命令或者腳本時使用的主目錄。
用戶任務調度:用戶定期要執行的工作,比如用戶數據備份、定時郵件提醒等。用戶可以使用 crontab 工具來定製自己的計劃任務。所有用戶定義的crontab文件都被保存在/var/spool/cron目錄中。其文件名與用戶名一致,使用者許可權文件如下:
/etc/cron.deny 該文件中所列用戶不允許使用crontab命令
/etc/cron.allow 該文件中所列用戶允許使用crontab命令
/var/spool/cron/ 所有用戶crontab文件存放的目錄,以用戶名命名
crontab文件的含義:用戶所建立的crontab文件中,每一行都代表一項任務,每行的每個欄位代表一項設置,它的格式共分為六個欄位,前五段是時間設定段,第六段是要執行的命令段,格式如下:
minute hour day month week command 順序:分 時 日 月 周
其中:
minute: 表示分鍾,可以是從0到59之間的任何整數。
hour:表示小時,可以是從0到23之間的任何整數。
day:表示日期,可以是從1到31之間的任何整數。
month:表示月份,可以是從1到12之間的任何整數。
week:表示星期幾,可以是從0到7之間的任何整數,這里的0或7代表星期日。
command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件。
在以上各個欄位中,還可以使用以下特殊字元:
星號(*):代表所有可能的值,例如month欄位如果是星號,則表示在滿足其它欄位的制約條件後每月都執行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,「1,2,5,7,8,9」
中杠(-):可以用整數之間的中杠表示一個整數范圍,例如「2-6」表示「2,3,4,5,6」
正斜線(/):可以用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute欄位,表示每十分鍾執行一次。
crond服務
/sbin/service crond start //啟動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啟服務
/sbin/service crond reload //重新載入配置
查看crontab服務狀態:
service crond status
手動啟動crontab服務:
service crond start
查看crontab服務是否已設置為開機啟動,執行命令:
ntsysv
加入開機自動啟動:
chkconfig –level 35 crond on
H. linux使用crontab實現PHP執行計劃定時任務
首先說說cron,它是一個linux下的定時執行工具。根用戶以外的用戶可以使用
crontab
工具來配置
cron
任務。所有用戶定義的
crontab
都被保存在/var/spool/cron
目錄中,並使用創建它們的用戶身份來執行。要以某用戶身份創建一個
crontab
項目,登錄為該用戶,然後鍵入
crontab
-e
命令來編輯該用戶的
crontab。該文件使用的格式和
/etc/crontab
相同。當對
crontab
所做的改變被保存後,該
crontab
文件就會根據該用戶名被保存,並寫入文件
/var/spool/cron/username
中。cron
守護進程每分鍾都檢查
/etc/crontab
文件、etc/cron.d/
目錄、以及
/var/spool/cron
目錄中的改變。如果發現了改變,它們就會被載入內存。這樣,當某個
crontab
文件改變後就不必重新啟動守護進程了。
安裝crontab:
yum
install
crontabs
說明:
/sbin/service
crond
start
//啟動服務
/sbin/service
crond
stop
//關閉服務
/sbin/service
crond
restart
//重啟服務
/sbin/service
crond
reload
//重新載入配置
查看crontab服務狀態:service
crond
status
手動啟動crontab服務:service
crond
start
查看crontab服務是否已設置為開機啟動,執行命令:ntsysv
加入開機自動啟動:
chkconfig
–level
35
crond
on
crontab命令:
功能說明:設置計時器。
語法:crontab
[-u
<用戶名稱>][配置文件]
或
crontab
[-u
<用戶名稱>][-elr]
補充說明:cron是一個常駐服務,它提供計時器的功能,讓用戶在特定的時間得以執行預設的指令或程序。只要用戶會編輯計時器的配置文件,就可以使
用計時器的功能。其配置文件格式如下:
Minute
Hour
Day
Month
DayOFWeek
Command
參數:
-e
編輯該用戶的計時器設置。
-l
列出該用戶的計時器設置。
-r
刪除該用戶的計時器設置。
-u<用戶名稱>
指定要設定計時器的用戶名稱。
crontab
格式:
基本格式
:
分鍾
小時
日
月
星期
命令
*
*
*
*
*
*
第1列表示分鍾1~59
每分鍾用*或者
*/1表示
第2列表示小時1~23(0表示0點)
第3列表示日期1~31
第4列
表示月份1~12
第5列標識號星期0~6(0表示星期天)
第6列要運行的命令
記住幾個特殊符號的含義:
「*」代表取值范圍內的數字,
「/」代表」每」,
「-」代表從某個數字到某個數字,
「,」分開幾個離散的數字
#
Use
the
hash
sign
to
prefix
a
comment
#
+—————-
minute
(0
–
59)
#
|
+————-
hour
(0
–
23)
#
|
|
+———-
day
of
month
(1
–
31)
#
|
|
|
+——-
month
(1
–
12)
#
|
|
|
|
+—-
day
of
week
(0
–
7)
(Sunday=0
or
7)
#
|
|
|
|
|
#
*
*
*
*
*
command
to
be
executed
crontab幾個例子如下:
(1)第一個例子。
30
21
*
*
*
/etc/init.d/nginx
restart
每晚的21:30重啟
nginx。
(2)第二個例子,也就是本教程測試的例子
*
*
*
*
*
/usr/bin/php
-f
/root/test.php
>>
test.log
每一分鍾執行/root/test.php文件,將結果輸出到test.log中。
完成了上面基礎工作後,就來看看怎麼使用crontab定時執行PHP腳本:
(1)我在/root下新建test.php文件,內容如下:
復制代碼
代碼如下:
<?php
#!/usr/bin/php
-q
echo
date('Y-m-d
H:i:s')."from
http://www.phpddt.com
";
?>
說明:你可以用whereis
php查找php執行文件位置。
(2)然後crontab
-e編寫如下shell:
復制代碼
代碼如下:
*
*
*
*
*
/usr/bin/php
-f
/root/test.php
>>
test.log
說明:test.php必須為可執行文件:chmod
+x
test.php
測試結果很正常,截圖如下:
當然你可以用使用crontab
-e繼續添加任務,在/var/spool/cron下你可以看到一個root文件。
windows下直接用windows計劃任務,通過bat打開網頁就可以了。不像linux這么復制。