linux信号以及core
linux信號以及core
何為信號
信號(signal)用于通知進程發(fā)生了某種情況。進程有以下3種處理信號的方式:
以上摘自《APUE》中文版14頁
信號類型
[root@test ~]# kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 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每個信號有其默認的處理方式,參考manpage,分為以下幾種類型
Term Default action is to terminate the process.
Ign Default action is to ignore the signal.
Core Default action is to terminate the process and dump core (see
core(5)).
Stop Default action is to stop the process.
Cont Default action is to continue the process if it is currently
stopped.
例如我們常用的kill的默認信號SIGTERM(15),以及強制結(jié)束信號SIGKILL(9),其對應(yīng)的處理方式都是Term,我們經(jīng)常使用SIGABRT(6)對應(yīng)處理方式是Core,可以用來產(chǎn)生core-dump文件
core文件詳解
core文件是ELF-formatted文件,可以使用readelf查看core的elf信息。它包含了程序運行時的內(nèi)存,寄存器狀態(tài),堆棧指針,內(nèi)存管理信息等
配置coredump
- 開啟coredump
- 設(shè)置coredump的命名規(guī)則
- 通過cat /proc/sys/kernel/core_pattern 驗證設(shè)置的pattern
- 每個進程也可以通過setrlimit的RLIMIT_CORE配置進程級別的core大小
控制coredump的mapping
/proc/[pid]/coredump_filter可以指定怎樣的進程空間內(nèi)存可以保存到core文件里,它是由下面的bitmask組成
- (bit 0) anonymous private memory(匿名私有內(nèi)存段,例如:動態(tài)變了)
- (bit 1) anonymous shared memory(匿名共享內(nèi)存段)
- (bit 2) file-backed private memory(file-backed 私有內(nèi)存段)
- (bit 3) file-backed shared memory(file-bakced 共享內(nèi)存段,例如:動態(tài)鏈接庫)
- (bit 4) ELF header pages in file-backed private memory areas (it is effective only if the bit 2 is cleared)(ELF 文件映射,只有在bit 2 復(fù)位的時候才起作用)
- (bit 5) hugetlb private memory(大頁私有內(nèi)存)
- (bit 6) hugetlb shared memory(大頁共享內(nèi)存)
- bit 7 (since Linux 4.4) Dump private DAX pages.
- bit 8 (since Linux 4.4) Dump shared DAX pages.
默認配置是0x33,也就是說bits 0 (anonymous private mappings), 1 (anonymous shared mappings), 4 (ELF headers) and 5 (private huge pages) 都會被dump出。如果想改變bitmask,可以使用如下方法:
echo 0x00000001 > /proc/[pid]/coredump_filter也可以配置在當前shell生效的coredump_filter
# 如果沒有下面的文件,請檢查內(nèi)核參數(shù)CONFIG_ELF_CORE是否配置 $ echo 0x7 > /proc/self/coredump_filter $ ./some_program注意:
產(chǎn)生core-dump的方法
gcore
- gcore實際上就是gdb里面的一個命令,它的作用是把進程的memory全部dump出來,和系統(tǒng)調(diào)用abort()等方法的實現(xiàn)方式是不同的。最直觀的感受是gcore會把進程全部的VIRT內(nèi)存dump出來。產(chǎn)生的core文件有可能會很大,并且它的大小不受ulimit -c限制。
- 使用gcore dump出的core文件,在gdb中使用info files查看每段內(nèi)存的大小,比使用abort()dump出的要大的多,原因應(yīng)該是gcore把沒有用到的虛擬內(nèi)存也dump出來了
- gcore執(zhí)行過程中程序處于stopped狀態(tài)
- 命令行中的gore命令其實是RedHat linux制作的一個shell script用來調(diào)用gdb,所以如果你調(diào)用了命令行g(shù)core [pid],它實際上會執(zhí)行如下的gdb命令,如下,以進程40923為例:
所以,如果你沒有g(shù)core命令,也可以使用如下命令產(chǎn)生gcore
gdb --pid=40923 --batch -ex gcoresignal 函數(shù)
SIGCHLD
僵尸進程的危害
所謂僵尸進程,形象來說,進程已死,但其尸體還在,沒人收尸啊,冤魂不散,仍然占用一個進程號,如果主進程不妥善處理,當僵尸進程數(shù)量巨大之后,就沒法再次fork了,所以對于大型并發(fā)服務(wù)器來說,當建立了進程池,一定要想辦法處理掉所有僵尸進程。
SIGPIPE
《UNP》中文版113頁
SIGIO
信號驅(qū)動式I/O模型, 利用信號,讓內(nèi)核在描述符就緒時發(fā)送SIGIO信號通知進程
其他相關(guān)函數(shù)
sigation
- 在一些較早的系統(tǒng)上(《UNP》P105),signal設(shè)置的信號句柄只能起一次作用,信號被捕獲一次后,信號句柄就會被還原成默認值了。我們現(xiàn)在用的linux系統(tǒng)應(yīng)該沒有關(guān)系的
- sigaction設(shè)置的信號句柄,可以一直有效,直到你再次改變它的設(shè)置。
sigation的定義:
struct sigaction {void (*sa_handler)(int);void (*sa_sigaction)(int, siginfo_t *, void *);sigset_t sa_mask;int sa_flags; // 一般置0, 有一些特殊的標志位會用到這個, 如SA_NOCLDSTOP等void (*sa_restorer)(void); };wait和waitpid函數(shù)
wait 函數(shù)可以用來處理已終止的子進程
#include <sys/wait.h> pid_t wait(int *statloc); pid_t waitpid(pid_t pid, int *statloc, int options); // 成功返回進程ID, 出錯返回0或-1waitpid()
《UNIX網(wǎng)絡(luò)編程》 P110
通過waitpid設(shè)置WNOHANG選項,可以告知waitpid在有尚未終止的子進程在運行時不要阻塞
參考鏈接
總結(jié)
以上是生活随笔為你收集整理的linux信号以及core的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员如何用糖果实现盈利 - [别人家的
- 下一篇: linux的链接库