目錄
1 信號(signal)
2 設置信號響應方式 – signal
3 設置定時器
4 示例
問題:
getch()阻塞獲取鍵盤按鍵輸入, 怎么操作才能不影響小鳥下落和管道移動?
getch如果阻塞,下面的程序都是無法執(zhí)行。通過信號機制方式實現(xiàn)。
1 信號(signal)
在Linux中,軟中斷信號(signal,簡稱為信號)是在軟件層次上對中斷的一種模擬,用來通知進程發(fā)生了異步事件。內(nèi)核可以因為內(nèi)部事件而給進程發(fā)送信號,通知進程發(fā)生了某個事件。
信號響應的方式:
1.忽略信號,即對信號不做任何處理;
2.捕捉信號,即信號發(fā)生時執(zhí)行用戶自定義的信號處理函數(shù)。
3.執(zhí)行缺省操作,Linux對每種信號都規(guī)定了默認操作。
信號的檢測與處理流程圖
2 設置信號響應方式 – signal
#include <unistd.h>
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
成功時返回原先的信號處理函數(shù),失敗時返回SIG_ERR ?
signum:指明了所要處理的信號類型 ?
handler:描述了與信號關聯(lián)的動作 ?? ? ? ? ? ? ?
????????SIG_DFL代表缺省方式; SIG_IGN 代表忽略信號; ?? ? ? ? ? ? ?
????????指定的信號處理函數(shù)代表捕捉方式
示例
// 頭文件省略
void handler (int signo) {
printf(“HELLO!\n”);
}
int main() {
signal(SIGINT, handler);
while ( 1 ) ;
return 0;
}
3 設置定時器
struct itimerval {
struct timeval it_interval; /* 計時器重新啟動的間歇值 */
struct timeval it_value; /* 計時器安裝后首次啟動的初 }; 始值,之后就沒有用 */
struct timeval {
long tv_sec; /* 秒 */
long tv_usec; /* 微妙*/
};
計時器的實現(xiàn)
int setitimer(int which, const struct itimerval *value,
struct itimerval *ovalue)
參數(shù): which:間歇計時器類型, ? ?
? ? ? ? ? ? ? ? ? ?ITIMER_REAL ? ? //數(shù)值為0,發(fā)送的信號是SIGALRM。
????????????struct itimerval *value:將value指向的結構體設為計時器的當前值,
? ? ? ? ? ? struct itimerval *ovalue:保存計時器原有值。一般設置為NULL。
返回值: 成功返回0。失敗返回-1。
4 示例
#include <stdio.h>
#include <curses.h>
#include <signal.h>
#include <sys/time.h>
int x=10,y=10;
int a=5,b=10;
void handler(int sig)
{
move(a,b);
addch('B');
refresh();
b++;
}
int main(int argc, const char *argv[])
{
char ch;
initscr();//進入curses模式
curs_set(0);
noecho();//禁止字符顯示
keypad(stdscr,1);//允許使用功能鍵
start_color();//啟動顏色機制
init_pair(1,COLOR_WHITE, COLOR_RED);
init_pair(2,COLOR_GREEN,COLOR_WHITE);
signal(SIGALRM, handler);
/*設置定時時間*/
struct itimerval timer;
timer.it_value.tv_sec = 3;//首次啟動定時時間
timer.it_value.tv_usec = 0;
timer.it_interval.tv_sec = 1;//之后每次的定時時間
timer.it_interval.tv_usec = 0;
/*啟動定時*/
setitimer(ITIMER_REAL, &timer, NULL);
while(1){
ch = getch();
if(ch == 'Q')
{
attron(COLOR_PAIR(1));
move(x,y);
addch('A');
refresh();
y++;
attroff(COLOR_PAIR(1));
}
}
while(1);
endwin();//退出curses模式
return 0;
}
5 練習
使用信號機制實現(xiàn)每隔1s打印字符串“Flappy bird”,提交代碼。
方式1文章來源:http://www.zghlxwxcb.cn/news/detail-729663.html
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
void handle(int sig)
{
printf("Flappy bird\n");
}
int main(int argc,char *argv[])
{
struct sigaction act;
struct itimerval timevalue;
int ret;
act.sa_handler = handle;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
timevalue.it_interval.tv_sec = 1;
timevalue.it_interval.tv_usec = 0;
timevalue.it_value.tv_sec = 5;
timevalue.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &timevalue,NULL);
ret = sigaction(SIGALRM,&act,NULL);
if(ret < 0)
{
perror("sigaction");
return 0;
}
while(1)
{
}
return 0;
}
方式2文章來源地址http://www.zghlxwxcb.cn/news/detail-729663.html
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
void handle(int sig)
{
printf("Flappy bird\n");
}
int main(int argc,char *argv[])
{
struct itimerval timevalue;
timevalue.it_interval.tv_sec = 1;
timevalue.it_interval.tv_usec = 0;
timevalue.it_value.tv_sec = 5;
timevalue.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &timevalue,NULL);
signal(SIGALRM,handle);
while(1)
{
}
return 0;
}
到了這里,關于lv6 嵌入式開發(fā)-Flappy bird項目(信號機制、定時器功能實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!