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 的信號,終止主程式 
執行結果如下:

留言

這個網誌中的熱門文章

Linux 批次檔的寫法

【分享】如何顯示 Debug Message

[分享] Visual Studio 遠端偵錯