爲什麼不可能有一個單處理程序的多個定時器。我從下面的鏈接使用該程序,它不工作。他已經解釋了這個問題的原因,但不是很清楚。有人幫我,爲什麼它不工作? http://www.graphics-muse.org/wp/?p=868如何解決linux定時器信號處理程序
回答
沒有理由你不能使用相同的處理器與timer_create
創建多個定時器,提供您sigval
結構包含足夠的信息,根據需要在你的處理器來區分它們。
文章的要點是它是可能有多個定時器觸發相同的處理程序,但您需要根據一些傳遞的數據來區分它們。奇怪的是,作者使用的例子只是在代碼中說明這個距離的3/4,所以也許這是你的困惑的根源。
希望這篇文章的程序改造更清晰一些。它使用sival_ptr指向一個字符串,但它可以指向任何類型。這是定時器如何區分的。
#define _POSIX_C_SOURCE 199309
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
void timerHandler(int sig, siginfo_t *si, void *uc)
{
// obligator caution not to use printf and other async-unsafe calls
// in a handler in real programs
printf("I am timer %s\n", (char *) si->si_value.sival_ptr);
}
void makeTimer(char *name, int intervalMS)
{
struct sigevent te;
struct itimerspec its;
struct sigaction sa;
int sigNo = SIGRTMIN;
// Set up signal handler.
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timerHandler;
sigemptyset(&sa.sa_mask);
if (sigaction(sigNo, &sa, NULL) == -1)
errExit("sigaction");
// Set up timer
te.sigev_notify = SIGEV_SIGNAL;
te.sigev_signo = sigNo;
te.sigev_value.sival_ptr = name;
timer_t timerID;
if (timer_create(CLOCK_REALTIME, &te, &timerID) == -1)
errExit("timer_create");
its.it_value.tv_sec = intervalMS;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 0;
if (timer_settime(timerID, 0, &its, NULL) == -1)
errExit("timer_settime");
return;
}
int main(int argc, char *argv[])
{
char *arr[3] = {"number one", "number two", "number three"};
makeTimer(arr[0], 1);
makeTimer(arr[1], 2);
makeTimer(arr[2], 3);
while (sleep(5));
return(0);
}
但是如何調用每2ms,10ms和100ms的特定任務? – user3354789
你的代碼與我上面發佈的鏈接有什麼不同? – user3354789
我所做的更改主要是取出無關的東西,並將ptr更改爲指向字符串,而不是定時器ID以簡化如何完成的說明。至於你之前的pgm中的具體任務,你需要循環執行。您只需設置一次定時器並設置間隔,以便重複觸發。 – Duck
- 1. 如何用單個信號處理程序解決這個多個linux定時器
- 2. 用戶空間中的Linux C/C++定時器信號處理程序
- 3. 如何解決linux定時器錯誤?
- 4. POSIX定時器信號在信號處理程序中未被阻止
- 5. SIGKILL信號處理程序
- 6. 讀信號處理程序
- 7. Erlang Linux信號處理
- 8. C Linux信號處理
- 9. UNIX/Linux信號處理:SIGEV_THREAD
- 10. POSIX定時器和POSIX信號處理
- 11. 如何編寫sigabrt信號的信號處理程序?
- 12. 信號處理程序實例在Linux編程接口
- 13. 僅限於主進程的C Linux信號處理程序
- 14. 如何確定unix信號隊列中待處理的信號的數量(Linux)
- 15. 如何讓信號處理程序的打印時間過去?
- 16. 線程中的信號處理程序
- 17. 在linux中鏈接信號處理程序的正確方法?
- 18. 在Linux上共享vs繼承信號處理程序
- 19. 使用sigaction在Linux中的信號處理程序(C++)
- 20. c - 無法在Linux中訂閱新的信號處理程序
- 21. 信號處理程序vs事件處理程序
- 22. 如何使用SIGSEGV的信號處理程序調試程序
- 23. 信號處理程序停止計時器在C
- 24. 如何更改信號處理程序(C++/Linux)中的FPU上下文
- 25. 如何處理SIGABRT信號?
- 26. python如何處理信號?
- 27. 執行默認信號處理程序
- 28. Perl 5.10.0信號處理程序問題
- 29. 信號處理程序似乎工作
- 30. Perl信號處理程序和WIndows
你檢查了我的問題上面的鏈接??你可以做到!但在某些情況下,這是不可能的 – user3354789
我認爲我的觀點與他相同。您的處理程序需要區分哪些計時器正在關閉。 – abligh
@ user3354789,abligh是正確的。您需要將開關從認爲正確的方向轉換爲理解錯誤的原因。公平地說,這個例子中的代碼是相當糟糕的,並且只是3/4的方式來說明事情的工作方式。 – Duck