linux回調函數
㈠ linux下c++怎樣實現回調函數
「實現回調函數」就是按照它給的介面寫即可,就是普通的C++函數啊?!
㈡ linux哪些地方經常用到回調函數
驅動練習可以從寫字元驅動, 不需要開發板 像是字元驅動,塊驅動都可以在linux系統中測試,實驗 不需要開發板。 移植系統才需要開發板 你有一個新的硬體,想在linux系統中識別的時候,需要編寫驅動
㈢ 在linux下如何實現按鍵按下,按住3秒,按住5秒然後轉入不同的功能函數中去
我沒有實現過這個,但是以我的理解,不會出現按住3秒和5秒進入不同的功能函數中。
但是你可以自己實現這樣的功能,就是按鍵的中斷或者按鍵回調函數中,獲得這個按鍵,應用程序去讀取這個按鍵的按下時間,然後根據時間來進行相應的處理。
㈣ linux 中的signal 函數
這是個函數指針,
void ( *func )( int )是一個接受一個int型參數,不返回的函數的指針;
比如:
void F( int a ) { print( "%d", a ); }
void ( *func )( int ) = F;
func( 3 ); // 調用F函數輸出3
作為函數參數的函數指針有一個專門的名稱叫做回調,你可以把任意滿足回調函數參數特徵標的函數地址作為參數傳給signal。
在這里因為signal對於sig參數可以指定用戶自定義的信號處理函數,所以你可以把你要處理的這個sig的函數地址作為參數傳給signal,那麼系統接收到對應sig的時候就會通過你傳進去的地址調用你的這個函數。
㈤ Linux C 程序中設置了一個定時器,如果定時器回調函數是個相對耗時的處理函數,會出現什麼結果
當然可以,調用C庫時間函數,查詢當前時間,循環檢測時間,到了時間就進行你自己的操作了
㈥ Linux中select poll和epoll的區別
select、poll、epoll_wait參數及實現對比
1. select的第一個參數nfds為fdset集合中最大描述符值加1,fdset是一個位數組,其大小限制為__FD_SETSIZE(1024),位數組的每一位代表其對應的描述符是否需要被檢查。
select的第二三四個參數表示需要關注讀、寫、錯誤事件的文件描述符位數組,這些參數既是輸入參數也是輸出參數,可能會被內核修改用於標示哪些描述符上發生了關注的事件。所以每次調用select前都需要重新初始化fdset。
timeout參數為超時時間,該結構會被內核修改,其值為超時剩餘的時間。
select對應於內核中的sys_select調用,sys_select首先將第二三四個參數指向的fd_set拷貝到內核,然後對每個被SET的描述符調用進行poll,並記錄在臨時結果中(fdset),如果有事件發生,select會將臨時結果寫到用戶空間並返回;當輪詢一遍後沒有任何事件發生時,如果指定了超時時間,則select會睡眠到超時,睡眠結束後再進行一次輪詢,並將臨時結果寫到用戶空間,然後返回。
select返回後,需要逐一檢查關注的描述符是否被SET(事件是否發生)。
2. poll與select不同,通過一個pollfd數組向內核傳遞需要關注的事件,故沒有描述符個數的限制,pollfd中的events欄位和revents分別用於標示關注的事件和發生的事件,故pollfd數組只需要被初始化一次。
poll的實現機制與select類似,其對應內核中的sys_poll,只不過poll向內核傳遞pollfd數組,然後對pollfd中的每個描述符進行poll,相比處理fdset來說,poll效率更高。
poll返回後,需要對pollfd中的每個元素檢查其revents值,來得指事件是否發生。
3. epoll通過epoll_create創建一個用於epoll輪詢的描述符,通過epoll_ctl添加/修改/刪除事件,通過epoll_wait檢查事件,epoll_wait的第二個參數用於存放結果。
epoll與select、poll不同,首先,其不用每次調用都向內核拷貝事件描述信息,在第一次調用後,事件信息就會與對應的epoll描述符關聯起來。另外epoll不是通過輪詢,而是通過在等待的描述符上注冊回調函數,當事件發生時,回調函數負責把發生的事件存儲在就緒事件鏈表中,最後寫到用戶空間。
epoll返回後,該參數指向的緩沖區中即為發生的事件,對緩沖區中每個元素進行處理即可,而不需要像poll、select那樣進行輪詢檢查。
select、poll、epoll_wait性能對比
select、poll的內部實現機制相似,性能差別主要在於向內核傳遞參數以及對fdset的位操作上,另外,select存在描述符數的硬限制,不能處理很大的描述符集合。這里主要考察poll與epoll在不同大小描述符集合的情況下性能的差異。
測試程序會統計在不同的文件描述符集合的情況下,1s內poll與epoll調用的次數。統計結果如下,從結果可以看出,對poll而言,每秒鍾內的系統調用數目雖集合增大而很快降低,而epoll基本保持不變,具有很好的擴展性。
㈦ Linux下通過哪個命令怎麼查看中斷
與Linux設備驅動中中斷處理相關的首先是申請與釋放IRQ的API request_irq()和free_irq()。
C++是一種面向對象的計算機程序設計語言,由美國AT&T貝爾實驗室的本賈尼·斯特勞斯特盧普博士在20世紀80年代初期發明並實現,最初它被稱作「C with Classes」(包含類的C語言)。
它是一種靜態數據類型檢查的、支持多重編程範式的通用程序設計語言,支持過程化程序設計、數據抽象、面向對象程序設計、泛型程序設計等多種程序設計風格。
在C基礎上,一九八三年又由貝爾實驗室的Bjarne Strou-strup推出了C++,C++進一步擴充和完善了C語言,成為一種面向 對象的程序設計語言。
C++目前流行的編譯器最新版本是Borland C++ 4.5,Symantec C++ 6.1,和Microsoft Visual C++ 2012。
㈧ Linux內核中select,poll和epoll的區別
在Linux Socket伺服器短編程時,為了處理大量客戶的連接請求,需要使用非阻塞I/O和復用,select、poll
和epoll是Linux API提供的I/O復用方式,自從Linux 2.6中加入了epoll之後,在高性能伺服器領域得到廣泛的
應用,現在比較出名的nginx就是使用epoll來實現I/O復用支持高並發,目前在高並 發的場景下,nginx越來越
收到歡迎。
select:
下面是select的函數介面:
[cpp] view plain
int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
select 函數監視的文件描述符分3類,分別是writefds、readfds、和exceptfds。調用後select函數會阻塞,直
到有描述副就緒(有數據 可讀、可寫、或者有except),或者超時(timeout指定等待時間,如果立即返回設為
null即可),函數返回。當select函數返回後,可以 通過遍歷fdset,來找到就緒的描述符。
select目前幾乎在所有的平台上支持,其良好跨平台支持也是它的一個優點。select的一 個缺點在於單個進程
能夠監視的文件描述符的數量存在最大限制,在Linux上一般為1024,可以通過修改宏定義甚至重新編譯內核的
方式提升這一限制,但 是這樣也會造成效率的降低。
poll:
[cpp] view plain
int poll (struct pollfd *fds, unsigned int nfds, int timeout);
不同與select使用三個點陣圖來表示三個fdset的方式,poll使用一個 pollfd的指針實現。
[cpp] view plain
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events to watch */
short revents; /* returned events witnessed */
};
pollfd結構包含了要監視的event和發生的event,不再使用select「參數-值」傳遞的方式。同時,pollfd並沒有
最大數量限制(但是數量過大後性能也是會下降)。 和select函數一樣,poll返回後,需要輪詢pollfd來獲取
就緒的描述符。
從上面看,select和poll都需要在返回後,通過遍歷文件描述符來獲取已經就緒的socket。事實上,同時連接的
大量客戶端在一時刻可能只有很少的處於就緒狀態,因此隨著監視的描述符數量的增長,其效率也會線性下降。
epoll:
epoll的介面如下:
[cpp] view plain
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
主要是epoll_create,epoll_ctl和epoll_wait三個函數。epoll_create函數創建epoll文件描述符,參數size並
'不是限制了epoll所能監聽的描述符最大個數,只是對內核初始分配內部數據結構的一個建議。返回是epoll描
述符。-1表示創建失敗。epoll_ctl 控制對指定描述符fd執行op操作,event是與fd關聯的監聽事件。op操作
有三種:添加EPOLL_CTL_ADD,刪除EPOLL_CTL_DEL,修改EPOLL_CTL_MOD。分別添加、刪除和
修改對fd的監聽事件。epoll_wait 等待epfd上的io事件,最多返回maxevents個事件。
在 select/poll中,進程只有在調用一定的方法後,內核才對所有監視的文件描述符進行掃描,而epoll事先通
過epoll_ctl()來注冊一 個文件描述符,一旦基於某個文件描述符就緒時,內核會採用類似callback的回調機制,
迅速激活這個文件描述符,當進程調用epoll_wait() 時便得到通知。
epoll的優點主要是一下幾個方面:
1. 監視的描述符數量不受限制,它所支持的FD上限是最大可以打開文件的數目,這個數字一般遠大於2048,
舉個例子,在1GB內存的機器上大約是10萬左 右,具體數目可以cat /proc/sys/fs/file-max察看,一般來說這個
數目和系統內存關系很大。select的最大缺點就是進程打開的fd是有數量限制的。這對 於連接數量比較大的
伺服器來說根本不能滿足。雖然也可以選擇多進程的解決方案( Apache就是這樣實現的),不過雖然linux上面
創建進程的代價比較小,但仍舊是不可忽視的,加上進程間數據同步遠比不上線程間同步的高效,所以也 不是
一種完美的方案。
2. IO的效率不會隨著監視fd的數量的增長而下降。epoll不同於select和poll輪詢的方式,而是通過每個fd定義的
回調函數來實現的。只有就緒的fd才會執行回調函數。
3.支持電平觸發和邊沿觸發(只告訴進程哪些文件描述符剛剛變為就緒狀態,它只說一遍,如果我們沒有採取
行動,那麼它將不會再次告知,這種方式稱為邊緣觸發)兩種方式,理論上邊緣觸發的性能要更高一些,但是
代碼實現相當復雜。
4.mmap加速內核與用戶空間的信息傳遞。epoll是通過內核於用戶空間mmap同一塊內存,避免了無畏的內存拷貝。
㈨ linux中的hrtimer怎麼使用
1.hrtimers - 為高解析度kernel定時器,可作為超時或周期性定時器使用
1). hrtimer_init初始化定時器工作模式。
hrtimer_init(&vibe_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
vibe_timer.function = timer_func;
/* 設置定時器的回調函數,定時器到時該函數將被調用 */
static enum hrtimer_restart timer_func(struct hrtimer *timer)
註:該回調函數為原子操作不能被中斷
關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html
2). hrtimer_start的第二個參數用於設置超時參數。
hrtimer_start(&vibe_timer,
ktime_set(value / 1000, (value % 1000) * 1000000),HRTIMER_MODE_REL);
3).int hrtimer_cancel(struct hrtimer *timer);
要取消一個hrtimer,使用hrtimer_cancel:
㈩ linux sigaction 回調函數是另一個線程嗎
v假設你想從view1單方向的傳遞一個消息給view2,希望view2來處理一些事情。
則在 view2Controller.m 中 addObserver (相當於安排了一個值班人員) 和 對應的delegate (假設addObserver中設定的delegate:self) ,
view1Controller.m 中只需要postNotification 即可,單向的,發完了就不管了。