Linux信号(信号通信)

信号通讯

其实就是内核向用户发送信号,只有内核才能发送信号,用户是无法发出信号的
linux中信号可以通过命令 kill -l 查看

一共有64种信号

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

linux可以通过man 7 signal查看各个信号的作用

信号通信

一、信号的发送

信号的发送主要包括三个函数(kill、raise、alarm)

1.kill

函数原型
通过某个信号来对某个进程号为pid的进程进行操作

int kill(pid_t pid,int sig);

所需头文件

#include <signal.h>
#include <sys/types.h>

返回值:返回0为成功,-1为失败

例如:
linux中的kill命令其实就是通过kill函数实现的,我们可以通过kill函数写出我们自己的kill功能

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>

int main(int argc,char* argv[])
{
    if(argc!=3)
    {
        printf("please input two parameters sig and pid\n");
        return argc;
    }
    
    int pid = atoi(argv[2]);
    int sig = atoi(argv[1]);

    int r = kill(pid,sig);

    if(r==-1)
    {
        printf("kill the %d fail\n",pid);
    }
    printf("kill the %d success\n",pid);

    return 0;
}

2、raise

函数原型:
raise函数只有一个信号参数,他是自己作用自己的

int raise(int sig);

所需头文件:

#include <signal.h>
#include <sys/types.h>

返回值:成功则返回0, 出错则返回-1

例如:
进程对自己使用9号信号(SIGKILL),杀死进程自己

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

int main()
{
    printf("raise before\n");
    raise(9);
    printf("raise after\n");
    return 0;
}

3、alarm

函数原型
alarm函数相当于一个闹钟,它的参数是时间秒,在设置的时间后便会执行信号14号信号(SIGALRM)

unsigned int alarm(unsigned int seconds);

所需头文件:

#include <unistd.h>

返回值:
成功:如果之前已经设置了“闹钟”,则返回之前闹钟的剩余时间,否则返回为零
失败:-1

例如:
设置9秒时间后在运行14号信号(SIGALRM)

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

int main()
{
    printf("alarm before\n");
    alarm(9);
    int i;
    for(i=0;i<20;i++)
    {
        printf("%d\n",i);
        sleep(1);
    }
    return 0;
}

二、信号的处理

信号的处理主要包括(signal)

1.signal

函数原型:
signal函数就是对接受信号之后进行自定义处理,我们可以理解为现在有一个函数fun还有一个信号signum
则有signal(signum,fun);
意思是在接收到signum信号时,不去执行signum原本的命令而去执行fun函数,
(fun函数的位置上还可以有两个信号,即SIG_IGN:忽略该信号;SIG_DFL:按系统默认方式处理)

void (*signal(int signum,void (*handler)(int)));

所需头文件:

#include <signal.h>

例如:
在收到alarm的14号信号的时候,去执行Myfun函数

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void Myfun(int signum)
{
    int i;
    for(i=0;i<5;i++)
    {
        printf("accept signum success\n");
        sleep(1);
    }
    return ;
}

int main()
{
    int i;
    signal(SIGALRM,Myfun);
    alarm(9);
    for(i=0;i<20;i++)
    {
        printf("%d\n",i);
        sleep(1);
    }
    return 0;
}

父子进程通讯实例:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

void Myfun1(int signum)
{
    int i;
    for(i=0;i<5;i++)
    {
        printf("accept signum:%d\n",signum);
        sleep(1);
    }
}

void Myfun2(int signum)
{
    wait(NULL);
}

int main()
{
    pid_t pid = fork();
    if(pid < 0)
    {
        printf("fork fail\n");
    }
    else
    {
        printf("fork success\n");
    }
    if(pid == 0)
    {
        sleep(10);
        kill(getppid(),10);
        sleep(10);
    }
    else
    {
        int i = 1;
        signal(10,Myfun1);
        signal(SIGCHLD,Myfun2);
        while(1)
        {
            printf("%d\n",i);
            sleep(1);
            i++;
        }
    }
    return 0;
}

发布了28 篇原创文章 · 获赞 0 · 访问量 997

猜你喜欢

转载自blog.csdn.net/wfea_lff/article/details/104007185