linux下常見的宕機訊號,如下:
訊號名編號值
描述系統預設處理方式
sigint
2正常終止程序(ctrl + c)
終止程序
sigquit
3異常終止程序
終止程序,並允許產生core檔案
sigabrt
6異常終止程序
終止程序,並允許產生core檔案
sigbus
7異常終止程序,硬體錯誤
終止程序,並允許產生core檔案
sigfpe
8錯誤的算術運算,比如除數為0
終止程序
sigkill
9異常終止程序,非法指令
終止程序
sigse**
11異常終止程序,訪問無效的位址
終止程序,並允許產生core檔案
sigpipe
13向沒有讀許可權的管道檔案寫操作
終止程序
sigterm
15kill pid時預設傳送的訊號
終止程序
sigstkflt
16linux專用,數學協處理器的棧異常
終止程序
static
void
print_maps
(void);
char buff[
512]=;
pid =
getpid()
;snprintf
(cmd,
sizeof
(cmd)
,"cat /proc/%d/maps"
, pid)
; fp =
popen((
const
char
*)cmd,
"r");if
(fp !=
null)}
pclose
(fp);}
static
void
systemerrorhandler
(int signum)
intcatch_sigse**_info
(void
)
其中print_maps列印的是程序執行時動態載入的maps對映,因為動態庫在執行的時候才分配位址空間,每次執行時的位址範圍都不一樣。用backtrace列印出來的宕機位址偏移,並不能直接用addr2line命令定址找到位置,會提示??:?必須通過maps的範圍,找到正確的位址偏移,才能用addr2line正確定位到宕機位置。
例如:編譯的時候需要加上引數:-g -rdynamicb6b58000-b6c99000 r-xp 00000000 b3:03 18443 /system/lib/libtest.so
b6c99000-b6ca8000 —p 00141000 b3:03 18443 /system/lib/libtest.so
b6ca8000-b6cc8000 rw-p 00140000 b3:03 18443 /system/lib/libtest.so
若宕機位址是libtest.so(0xb6b59000), 那麼用0xb6b59000 - 0xb6b58000 = 0x1000,然後用addr2liine -c -e libtest.so 0x1000 則可得到正確的宕機位置
嵌入式系統還需要加上引數: -funwind-tables -ffunction-sections
字串陣列
使用signal.h標頭檔案下的字串陣列sys_siglist,將訊號作為下標時,字串就是對應的訊號含義:
#include
extern const char * const sys_siglist;
psignal函式
定義如下:
#include
void psignal (int signo, const char *msg);
這個函式的使用同perror類似,例如,呼叫:
psignal(13, 「signal」);
將會顯示「signal: broken pipe」
strsignal函式
與perror和strerror兩個函式類似,有psignal,其實也有strsignal函式,定義如下:
#include
char * strsignal (int signo);
效果和strerror類似。需要注意這個函式返回的字串指標僅在下一次呼叫strsignal前保持不變,所以這個函式不是執行緒安全的。
no pains, no gains.
linux下串列埠使用
串列埠終端程式設計順序 開啟 設定 讀寫 關閉。涉及到的api。1 獲取終端屬性tcgetattr 原型 int tcgetattr int fd,struct termios termios p 功能 取得終端介質 fd 初始值,並把其值賦給temios p 函式可以從後台程序中呼叫 但是,終端屬...
linux 下vi 的使用
進入vi的命令 vi filename 開啟或新建檔案,並將游標置於第一行首 vi n filename 開啟檔案,並將游標置於第n行首 vi filename 開啟檔案,並將游標置於最後一行首 vi pattern filename 開啟檔案,並將游標置於第乙個與pattern匹配的串處 vi r...
Linux下使用Ntfs分割槽
在使用windows作業系統時,ntfs做為最常用的分割槽格式存在,但是因為這個格式在linux下預設不能直接使用,所以linux使用者不能充分利用ntfs格式的硬碟空間,因為linux沒有將掛載ntfs格式這項功能編譯到核心裡面,所以使用者必須重新編譯核心 但是編譯過程比較複雜又很難保證一定能夠掛...