日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux信号以及core

發(fā)布時(shí)間:2024/2/28 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux信号以及core 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

linux信號(hào)以及core

何為信號(hào)

信號(hào)(signal)用于通知進(jìn)程發(fā)生了某種情況。進(jìn)程有以下3種處理信號(hào)的方式:

  • 忽略信號(hào)。有些信號(hào)表示硬件異常,例如,除以0或訪問(wèn)進(jìn)程地址空間以外的存儲(chǔ)單元等,因?yàn)檫@些異常產(chǎn)生的后果不確定,所以不推薦使用這種處理>方式。
  • 按系統(tǒng)默認(rèn)方式處理。對(duì)除數(shù)為0,系統(tǒng)默認(rèn)方式是終止進(jìn)程。
  • 提供一個(gè)函數(shù),信號(hào)發(fā)生時(shí)調(diào)用該函數(shù),這被稱為捕抓該信號(hào)。通過(guò)提供自編的函數(shù),我們就能知道什么時(shí)候產(chǎn)生了信號(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
    # 開啟coredump ulimit -c unlimited # 持久化方式 echo "ulimit -c unlimited" >> /etc/profile
    • 設(shè)置coredump的命名規(guī)則
    # 在/etc/sysctl.conf文件中加入 # 例如下面這個(gè)命令,可以通過(guò)在%e前面增加/home/之類的路徑使其保存到特定路徑 kernel.core_pattern=%e.core.%s_%t 并保存退出,執(zhí)行下面指令使其生效 sysctl -p# 參數(shù)含義%% output one '%'%p pid%u uid%g gid%s signal number%t UNIX time of dump%h hostname%e executable filename# 默認(rèn)是這樣的 |/usr/share/apport/apport %p %s %c %PIf the first character of the pattern is a '|', the kernel will treatthe rest of the pattern as a command to run. The core dump will bewritten to the standard input of that program instead of to a file.
    • 通過(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

    注意:

  • 如果你想設(shè)置全局的coredump_filter,可以參考這篇文章
  • MMIO的頁(yè)永遠(yuǎn)不會(huì)被dump出來(lái)
  • 產(chǎn)生core-dump的方法

  • 發(fā)信號(hào)SIGABRT,會(huì)終止進(jìn)程
  • gcore,gcore會(huì)調(diào)用gdb產(chǎn)生coredump,不會(huì)終止進(jìn)程,但是產(chǎn)生core的時(shí)候進(jìn)程會(huì)處于stopped狀態(tài)
  • 設(shè)置信號(hào)處理函數(shù),信號(hào)處理函數(shù)fork()后abort()
  • google-coredumper上述的方法1終止進(jìn)程,方法2會(huì)暫停進(jìn)程,所以谷歌就做了個(gè)coredump庫(kù),支持在運(yùn)行時(shí)coredump
  • 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為例:
    gdb --nx --batch -ex set pagination off -ex set height 0 -ex set width 0 -ex attach 40923 -ex gcore core.40923 -ex detach -ex quit

    所以,如果你沒(méi)有g(shù)core命令,也可以使用如下命令產(chǎn)生gcore

    gdb --pid=40923 --batch -ex gcore

    signal 函數(shù)

  • 信號(hào)處理函數(shù)signal 規(guī)定了在某種信號(hào)signo情況下調(diào)用func處理
  • 正在處理的時(shí)候,其他信號(hào)是不能遞交的,必須等當(dāng)前信號(hào)處理完畢,其他信號(hào)才能遞交
  • #include <signal.h> typedef void Sigfunc(int); Sigfunc *signal(int signo, Sigfunc *func)

    SIGCHLD

  • 子進(jìn)程終止時(shí),會(huì)給父進(jìn)程發(fā)一個(gè)SIGCHLD信號(hào)(其實(shí)這個(gè)信號(hào)是由內(nèi)核在進(jìn)城終止時(shí)發(fā)給父進(jìn)程的(《UNIX網(wǎng)絡(luò)編程》P103)),如果父進(jìn)程不處理的話,子進(jìn)程機(jī)會(huì)變成僵尸進(jìn)程
  • 父進(jìn)程只需要在信號(hào)處理函數(shù)里面調(diào)用wait即可。
  • 如果不想子進(jìn)程產(chǎn)生僵尸進(jìn)程,可以設(shè)置SIG_IGN signal(SIGCHLD, SIG_IGN);
  • signal(SIGCHLD, sig_chld);void sig_chld(int signo) {pid_t pid;int stat;pid = wait(&stat);printf("child %d terminated\n", pid);return; }

    僵尸進(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è)

  • A與B連接, B異常終止了,這是B會(huì)終止socket連接并且給A發(fā)一個(gè)fin,
  • 這時(shí)如果A再給B發(fā)一個(gè)寫, B的套接字會(huì)回一個(gè)RST
  • 如果A再再給B發(fā)一個(gè)寫, 會(huì)引發(fā)SIGPIPE信號(hào), 這個(gè)信號(hào)試圖終止進(jìn)程A, 如果A不情愿被終止,那么必須signal捕獲該信號(hào)并處理,但是無(wú)論如何,寫操作都會(huì)fail并且errno=EPIPE
  • signal函數(shù)最簡(jiǎn)單的方法就是把SIGPIPE置成SIG_IGN,這樣進(jìn)程就會(huì)忽略SIGPIPE信號(hào)。
  • signal(SIGPIPE, SIG_IGN);

    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è)置。
    struct sigaction sa; sa.sa_handler = SIG_IGN; sigaction( SIGPIPE, &sa, 0 );

    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或-1
  • 通過(guò)返回,返回已終止子進(jìn)程的ID
  • 通過(guò)statloc指針?lè)祷刈舆M(jìn)程終止?fàn)顟B(tài)
  • waitpid()

    《UNIX網(wǎng)絡(luò)編程》 P110

    通過(guò)waitpid設(shè)置WNOHANG選項(xiàng),可以告知waitpid在有尚未終止的子進(jìn)程在運(yùn)行時(shí)不要阻塞

    參考鏈接

  • Linux信號(hào)(一):信號(hào)類型
  • What’s the easiest way to detect what signals are being sent to a process?
  • signal(7) — Linux manual page信號(hào)的不同用處
  • core(5) — Linux manual page
  • 線上內(nèi)存泄漏的正確查找姿勢(shì)
  • 總結(jié)

    以上是生活随笔為你收集整理的linux信号以及core的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。