Character bitmap with signal
#include <stdio.h> #include <signal.h> #include <unistd.h> //how_bitmap函式可將二維陣列的值輸出,輸出方式:當bit為1時輸出’*’,0輸出空白 //字元’ ’,每處理完2個byte輸出換行'\n' void update_time(int sig); char array[2][30] = { { 0x08,0x20,0x08,0x24,0xfe,0xfe,0x08,0x20, 0x00,0x00,0x08,0x20,0x04,0x40,0x04,0x40, 0x02,0x80,0x01,0x00,0x02,0x80,0x0c,0x70, 0x30,0x0e,0xc0,0x04,0x00,0x00 }, { 0x20,0x20,0x51,0xfc,0x88,0x88,0x00,0x50, 0xfb,0xfe,0x22,0x22,0x22,0x22,0xf9,0xfc, 0x21,0x24,0x21,0x24,0xa9,0x24,0x71,0x2c, 0x20,0x20,0xf8,0x20,0x00,0x00 } }; void update_time(int sig) { static int i = 0; static char *ptr = (char*)(void*)array; // change to one dimention char array int j,k; if (i < sizeof(array)) { for (j=0; j<2; j++) { for (k=7; k>=0; k--) { printf("%c", (*(ptr+i) & (1 << k)) ? '*' : ' '); } i++; } printf("\n"); alarm(2); // trigger again } else { kill(getpid(), SIGTERM); // terminate the process } } int main() { signal(SIGALRM,update_time); // register signal handler alarm(2); // first trigger while (1); }
主要重點:
- Signal handler 的宣告與實作
- Handler 內使用靜態變數 (因為該 Handler 由 OS 呼叫,故無法傳遞參數)
- 將原本的二維 array 轉換為一維的 char *ptr,方便程式處理
- Signal 僅觸發一次,故在 Handler 中處理結束後要再次觸發
- 所有字元印列完畢後,送出 SIGTERM 的信號,終止主程式
留言