进程间通信——信号

Posted it8343

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程间通信——信号相关的知识,希望对你有一定的参考价值。

程序接受到信号以后,会做出相应的处理。代码如下:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<signal.h>
 4 #include<unistd.h>
 5 void fun()//改变段错误的显示内容
 6 {
 7     int n;
 8     alarm(10);// 添加一个定时器信号,10秒后触发
 9     for(n=0;n<100;n++)
10     {   
11         printf("出现了核心的错误
");
12         sleep(1);
13     }   
14     exit(0);
15 }
16 
17 void fun2()//使ctrl C不产生退出
18 {
19 }
20 
21 int main()
22 {
23     signal(SIGSEGV,fun);//SIGSEGV是出现段错误的信号
24     signal(SIGINT,fun2);//SIGINT是ctrl C的退出信号
25     int *p; 
26     *p=20;//野指针,产生段错误
27 }

结果如下:

出现了核心的错误
出现了核心的错误
出现了核心的错误
出现了核心的错误
出现了核心的错误
出现了核心的错误
出现了核心的错误
出现了核心的错误
出现了核心的错误
出现了核心的错误
闹钟

 

 

 以上程序检测到段错误,自动传递了11(SIGSEGV)信号给进程(捕捉信号),而alarm(int)是把SIGALRM信号传递给当前的进程,在某些时候,我们需要手动的给某个程序传递一些自定义的信号,此时该怎么处理呢?

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

void fun()// 设置信号
{
    printf("恭喜您,退出成功
");
    exit(0);
}

int main()
{
    signal(12,fun);//自定义12信号(10、12为用户自定义信号)
    while(1)//让进程不断输出“欢迎光临”
    {   
        printf(" 欢迎光临
");
        sleep(1);
    }   
    return 0;
}

结果:先运行程序,循环输出“欢迎光临”,再输入ps -aux查看所有进程,找到所运行的进程id

技术分享图片

利用kill发送信号,把12这个讯号传递个5459这个进程,可以看到进程再收到讯号之后,做出了相应的动作

技术分享图片

以上是关于进程间通信——信号的主要内容,如果未能解决你的问题,请参考以下文章

linux进程间通信之Posix 信号量用法详解代码举例

进程间通信四(信号量)

进程间通信之信号量

Linux进程间通信——使用信号量(转)

进程间通信之-----信号量

Linux进程间通信-信号量