2023年1月29日星期日

[C Language] linux signal 範例程式

 下面介紹一個範例程式名為 "signal",編譯此程式之後,把此程式run在背景,可以使用下面幾個指令,來觸發此程式當中的 printf來印出相對應的訊息,當然你也可以把 printf 改成你想做的事情

 kill -SIGHUP `pidof signal`
 kill -SIGINT `pidof signal`
 kill -SIGQUIT `pidof signal`


======================= signal.c =================

#include <signal.h>
#include <unistd.h>
#include <stdio.h>

void sigroutine(int sig_num) {
    switch(sig_num) {
        case 1:
                printf("Get a signal - SIGHUP \n");
        case 3:
                
printf("Get a signal - SIGQUIT \n");
        case 10:
                printf("Get a signal - SIGUSR1 \n");
    }
    return;
}

int main() {
    printf("process id is %d\n", getpid());
    signal(SIGHUP, 
sigroutine);
    signal(SIGQUIT, sigroutine);
    signal(SIGUSR1, sigroutine);
    for (;;) ;
}

==============================================


另外列出,所有可以帶入 kill 後面的sigmal列表(Reference from google)
2 - 就是我們常見的鍵盤中斷 CTRL+c
9 - 就是我們常用來kill process的 signal



信號取值默認動作含義(發出信號的原因)
SIGHUP1Term終端的掛斷或進程死亡
SIGINT2Term來自鍵盤的中斷信號
SIGQUIT3Core來自鍵盤的離開信號
SIGILL4Core非法指令
SIGABRT6Core來自abort的異常信號
SIGFPE8Core浮點例外
SIGKILL9Term殺死
SIGSEGV11Core段非法錯誤(內存引用無效)
SIGPIPE13Term管道損壞:向一個沒有讀進程的管道寫數據
SIGALRM14Term來自alarm的計時器到時信號
SIGTERM15Term終止
SIGUSR110Term用戶自定義信號1
SIGUSR212Term用戶自定義信號2
SIGCHLD20,17,18Ign子進程停止或終止
SIGCONT19,18,25Cont如果停止,繼續執行
SIGSTOP17,19,23Stop非來自終端的停止信號
SIGTSTP18,20,24Stop來自終端的停止信號
SIGTTIN21,21,26Stop後台進程讀終端
SIGTTOU22,22,27Stop後台進程寫終端
SIGBUS10,7,10Core總線錯誤(內存訪問錯誤)
SIGPOLLTermPollable事件發生(Sys V),與SIGIO同義
SIGPROF27,27,29Term統計分佈圖用計時器到時
SIGSYS12,-,12Core非法系統調用(SVr4)
SIGTRAP5Core跟踪/斷點自陷
SIGURG16,23,21Ignsocket緊急信號(4.2BSD)
SIGVTALRM26,26,28Term虛擬計時器到時(4.2BSD)
SIGXCPU24,24,30Core超過CPU時限(4.2BSD)
SIGXFSZ25,25,31Core超過文件長度限制(4.2BSD)
SIGIOT6CoreIOT自陷,與SIGABRT同義
SIGEMT7,-,7Term
SIGSTKFLT-,16,-Term協處理器堆棧錯誤(不使用)
SIGIO23,29,22Term描述符上可以進行I/O操作
SIGCLD-,-,18Ign與SIGCHLD同義
SIGPWR29,30,19Term電力故障(System V)
SIGINFO29,-,-與SIGPWR同義
SIGLOST-,-,-Term文件鎖丟失
SIGWINCH28,28,20Ign窗口大小改變(4.3BSD, Sun)
SIGUNUSED-,31,-Term未使用信號(will be SIGSYS)


另外在Linux底下,輸入 kill -l 也可以看到這些SIGXXX 所定義的編號,如下:

$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX



使用 lsblk 印出 emmc 每個 partition的"名字"與"size"

使用以下的command可以印出 eMMC的 partition資訊 lsblk --bytes --output name,partlabel,size   參數說明 --bytes: partition的大小,以byte的方式輸出 --output: 後面可以指定要輸出的內容...