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