linux signal(1)

linux signal(1)_第1张图片

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    Broken pipe 向一个没有读端的管道写数据
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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

//13 SIGPIPE    向一个没有读端的管道写数据

linux signal(1)_第2张图片
这里写图片描述

//17 SIGCHLD 子进程结束的时候 会向父进程发送这个信号,默认动作是忽略
void chldhandler(int sig)
{
    printf("recv a sig = %d\n", sig);
}

int main(int argc, char const *argv[])
{
    pid_t pid;

    pid = fork();
    if (pid > 0)
    {
        //SIGCHLD 默认动作是忽略
        signal(SIGCHLD,chldhandler);
        wait(NULL);
        printf("父进程 id = %d\n",(int)getpid());

    }else if (pid == 0)
    {
        printf("子进程id=%d\n",(int)getpid());
    }else{
        ERR_EXIT("fork");
    }
    return 0;
}

这里写图片描述

//访问了无效的内存 ,著名的段错误。
int main(int argc, char const *argv[])
{
    /**
        访问受保护的地址
    */
    int * sp = (int *)0;
    *sp = 100;

    /**
        访问不存在的地址
    */
    int * ptr;
    *ptr = 100;

    /**
        访问只读的内存
    */
    char * username = "leesagacious";
    *username = "gcc";

    return 0;
}

8 : SIGFPE
void handler(int sig)
{
    printf("recv a sig = %d\n",sig);
    exit(0);
}
int main(int argc, char const *argv[])
{
    signal(SIGFPE,handler); //发生致命运算错误。
    int a = 100 / 0;

    return 0;
}

你可能感兴趣的:(Linux系统编程-C)