美文网首页
C编程-处理SIGTERM消息

C编程-处理SIGTERM消息

作者: louyang | 来源:发表于2018-06-15 09:56 被阅读34次

Linux系统中,kill命令用于给后台程序发消息,SIGTERM是众多消息中之一,也是缺省的消息。

$ kill 2573  // send SIGTERM to the process which pid is 2573

$ kill -l    // show all SIGNAL
 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
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

C代码,接受并处理SIGTERM消息。

#include <stdio.h>  // printf(), perror()
#include <stdlib.h> // exit()
#include <signal.h> // sig*()
#include <unistd.h> // getpid()
#include <string.h> // memset()

void handle_signal(int signal);

int main()
{
    struct sigaction sa;

    printf("My pid is: %d\n", getpid());

    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = &handle_signal;

    if (sigaction(SIGTERM, &sa, NULL) == -1) {
        perror("Error: cannot handle SIGINT"); // Should not happen
    }

    // Will always fail, SIGKILL is intended to force kill your process
    if (sigaction(SIGKILL, &sa, NULL) == -1) {
        perror("Cannot handle SIGKILL"); // Will always happen
        printf("You can never handle SIGKILL anyway...\n");
    }

    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("Error: cannot handle SIGINT"); // Should not happen
    }

    for (;;) {
        printf("\nSleeping for ~3 seconds\n");
        sleep(3);
    }
}

void handle_signal(int signal)
{
    switch (signal) {
        case SIGTERM:
            printf("Caught SIGTERM, exiting now\n");
            exit(0);
        case SIGINT:
            printf("Caught SIGINT, exiting now\n");
            exit(0);
        case SIGKILL:
            printf("Caught SIGKILL, exiting now\n");
            exit(0);
        default:
            fprintf(stderr, "Caught wrong signal: %d\n", signal);
            return;
    }

    printf("Done handling %s\n\n", signal);
}

编译运行:

$ gcc a.c && ./a.out
My pid is: 10703
Cannot handle SIGKILL: Invalid argument
You can never handle SIGKILL anyway...

Sleeping for ~3 seconds

Sleeping for ~3 seconds

打开另外一个终端窗口,输入:

$ kill 10703

第一个窗口中,可以看到:

Caught SIGTERM, exiting now
参考

https://major.io/2010/03/18/sigterm-vs-sigkill/
https://gist.github.com/aspyct/3462238
https://airtower.wordpress.com/2010/06/16/catch-sigterm-exit-gracefully/
https://www.cyberciti.biz/faq/unix-kill-command-examples/

相关文章

  • C编程-处理SIGTERM消息

    Linux系统中,kill命令用于给后台程序发消息,SIGTERM是众多消息中之一,也是缺省的消息。 C代码,接受...

  • Linux Signal

    SIGTERM vs. SIGKILL sigterm-vs-sigkill

  • C语言跨平台移植

    C语言编译流程: C源程序-->预编译处理(.c)-->编译、优化程序(.s、.asm)-->汇编程序(.obj、...

  • 超时消息处理 C语言

    前段时间有个需求是向S端发送消息,如果在20S之内没有收到S端的回执,就要对发送的消息进行超时处理。在一个线程中去...

  • 2019-05-06——Java Socket

    Socket是网络编程的基础。 基本通讯 客户端发送消息,服务端接收消息 双向通讯 并行处理 并发处理 serve...

  • 《白话C++入门》系列课程简介(请忽略--只为公号菜单)

    《白话C++入门》系列课程简介: 1,个人微信:mosjin请备注好友验证消息: 白话c++ 2,《白话C++编程...

  • PHP信号管理

    有 两个信号可以停止进程:SIGTERM和SIGKILL。 SIGTERM比较友好,进程能捕捉这个信号,根据您的...

  • Objective-C Runtime技术调研(二)

    一、Objective-C的消息传递 1.1 基本消息传递 在面向对象编程中,对象调用方法叫做发送消息。在编译时,...

  • C/C++ 预处理元编程

    从一个问题开始 以下代码存在结构性重复,如何消除? 上面的例子中除了每个文件内部有结构性重复,文件之间也有结构性重...

  • C++ 学习笔记

    第一章 计算机与C++编程简介 C++程序6个阶段编程 ->预处理->编译->连接->装入->执行1.程序在编译器...

网友评论

      本文标题:C编程-处理SIGTERM消息

      本文链接:https://www.haomeiwen.com/subject/cblpeftx.html