2013-10-18 34 views
3

我想寫一個定期執行一些任務的C程序(比如說,在控制檯上打印某些東西)。Linux中的定期任務

我已經使用nanosleep如下實現它。每500ms函數'func'被調用。

#include <stdio.h> 
#include <time.h> 

void func(void); 

int main() 
{ 
    struct timespec mytimespec; 
    mytimespec.tv_sec = 0; 
    mytimespec.tv_nsec = 500000000; /* 500 ms */ 

    while(1) 
    { 
    func(); 
    nanosleep(&mytimespec,NULL); 
    } 
    return 0; 
} 

void func(void) 
{ 
    printf("This would be printed periodically\n"); 
} 

上述工作正常。但是我有些疑惑: -

  • 難道準確地工作,如果有多個線程和一個線程依賴於nanosleep做週期性任務?

  • 有沒有辦法在linux中產生週期性線程?或者,使用一些定時器回調?

+3

爲什麼不使用Cron? http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5 –

+0

@Ed Heal:謝謝。其實我想學習C/C++的做法。 –

+1

@Siddhartha Ghosh你應該指定這個線程的性質,導致機制應該由任務決定。 – Maquefel

回答

1

它會準確地工作,如果有多個線程和一個線程依賴了nanosleep做週期性任務?

函數nanosleep()將不會返回早於您在其參數中指定的值(除非它被信號處理程序中斷或遇到錯誤)。但它可能會在稍後返回(通常稍後會返回)。

請看看下面的文章: http://www.drdobbs.com/soft-real-time-programming-with-linux/184402031 - 它似乎很好地解釋了定時器。

有沒有辦法在linux中產生一個週期性線程?或者,使用一些定時器回調?

就以定時器來看看:http://man7.org/linux/man-pages/man2/timer_create.2.html

+0

「函數nanosleep()不會早於您在其參數中指定的時間返回,但它可能會稍後返回(通常是一點點)。」這不是真的 - 它可以被信號中斷。 – Maquefel

+1

@Maquefel - 已更正。 – smbear

1

有根據的任務很多:

1)您可以使用實時時鐘(男子RTC)

2)你可以使用cron (通過計時器產卵進程的任何過程)

3)你可以使用select/pselect(對於週期性線程產卵的小時間間隔很好)

/* Wait up to five seconds. */ 
      tv.tv_sec = 5; 
      tv.tv_usec = 0; 

      retval = select(1, 0, 0, 0, &tv); 

而且,如果您正在監視文件/目錄,則可以使用inotify。

+0

'選擇'阻止呼叫?它在等待時會吃掉CPU嗎? –

+0

@ Siddhartha Ghosh O_O - 當然,直到文件描述符準備就緒或者在我們的情況下,直到超時或者被信號中斷(這可以通過阻止信號來避免),請參閱man pselect。 – Maquefel

+0

我建議使用'poll',而不是'select'。谷歌關於'C10K問題'。 –

1

timer_create將是系統叫你正在尋找。

它有一個sigaction結構,指定應該調用回調的方式。

您必須初始化timer_settime函數的newvalue參數中的成員it_interval,以便每隔it_interval調用在sigaction結構中註冊的函數。

該函數可以是一個信號處理程序,一個當定時器過期時將運行的線程。

有關詳情,請參閱timer_create手冊頁。