进程间通信 ------ 信号通信

进程间通信 ===》信号通信
应用:异步通信。 中断,


1~64;32应用编程。
如何响应:
   

 kill 发信号

kill      -xx     xxxx  
发送进程  信号    接收进程
kill -9 1000
a.out  9 1000
1、发送端
#include <sys/types.h>
#include <signal.h>

int kill(pid_t pid, int sig);
功能:通过该函数可以给pid进程发送信号为sig的系统信号。
参数:pid 要接收信号的进程pid
  sig 当前程序要发送的信号编号 《=== kill  -l
返回值:成功 0
失败  -1;

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<sys/types.h>                                                       
  5 #include<signal.h>
  6 
  7 int main(int argc, const char *argv[])
  8 {
  9     printf("input pid");
 10     char buf[10]={0};
 11     fgets(buf,sizeof(buf),stdin);
 12     pid_t pid=atoi(buf); //字符串转为数字
 13     int ret=kill(pid,9);
 14     if(ret==-1)
 15     {
 16         perror("kill");
 17         exit(1);
 18     }
 19     return 0;
 20 }

 echo $$ 当前进程的id号

raise

raise 自己给自己发信号,所以只写自己的id

int raise(int sig)== kill(getpid(),int sig);
功能:给进程自己发送sig信号

alarm


unsigned int alarm(unsigned int seconds);SIGALAM
功能:定时由系统给当前进程发送信号,也称为闹钟函数,时间到了会提醒,但是不耽误做其他事情
(告诉内核帮助记录时间)
  闹钟只有一个,定时只有一次有效,
  但是必须根据代码逻辑是否执行判断。

pause

int pause(void);
功能:进程暂停,不再继续执行,除非
  收到其他信号。

走到第五秒就暂停了,cpu就跑到其他地方了,也相当于休眠

3、接收端
每个进程都会对信号作出默认响应,但不是唯一响应。
一般如下三种处理方式:
1、默认处理
2、忽略处理 9,19(强制关闭与暂停)
3、自定义处理 9,19 捕获

信号注册函数原型:signal


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

 typedef void (*sighandler_t)(int);
 ===》void (*xx)(int); == void fun(int);
 ===》xx是 void fun(int) 类型函数的函数指针
 ===》typedef void(*xx)(int)   sighandler_t; ///错误
  typedef int   myint;

 ===>sighandler_t signal(int signum, sighandler_t handler);
 ===> signal(int sig, sighandler_t fun);
 ===> signal(int sig, xxx fun);
 ===>fun 有三个宏表示:SIG_DFL 表示默认处理
   SIG_IGN 表示忽略处理
   fun     表示自定义处理

signal ( kill -l , 函数名 )

void 函数名(int num)

{

}

1)在暂停后终端发来一个信号(SIGCONT)使运行继续

kill -18 29521

  1 #include<stdlib.h>                                        
  2 #include<stdio.h>
  3 #include<signal.h>
  4 #include<unistd.h>
  5 
  6 void myhandle(int num)
  7 {
  8 }
  9 int main(int argc, const char *argv[])
 10 {
 11     signal(SIGCONT,myhandle);//从终端传送一个信号是继续
 12     int i=0;
 13     while(1)
 14     {
 15         printf("working %d\n",getpid());
 16         sleep(1);
 17         i++;
 18         if(i==5)
 19         {
 20             pause();
 21         }
 22     }
 23     return 0;
 24 }
~                                                             
~          

2)自己一直在玩,期间老爸叫了三次没有反应,之后老妈叫四遍在第四次停止游戏

signal(SIGUSR1,handle1);

signal(SIGUSR2,jamdle2);

SIG_IGN(忽略)

SIG_DFL(关闭)

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <signal.h>                                       
  5 
  6 void handle1(int num)
  7 {
  8     static int i = 0;
  9     printf("老爸叫你\n");
 10     i++;
 11     if(3 == i )
 12     {
 13         signal(SIGUSR1,SIG_IGN);
 14     }
 15 
 16 }
 17 void handle2(int num)
 18 {
 19     static int i = 0 ;
 20     printf("老妈叫你\n");
 21     i++;
 22     if(4== i)
 23     {
 24         signal(SIGUSR2,SIG_DFL);
 25     }
 26 }
 27 int main(int argc, char *argv[])
 28 {
 29     signal(SIGUSR1,handle1);
 30     signal(SIGUSR2,handle2);
 31     while(1)
 32     {
 33         printf("i'm playing pid :%d\n",getpid());
 34         sleep(1);
 35     }
 36     return 0;
 37 }
 38 
~      

 

 3)一个handle可以定义多个信号函数,根据num

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

void handle1(int num)
{
    if(SIGUSR1== num)
    {
        static int i = 0;
        printf("老爸叫你\n");
        i++;
        if(3 == i )
        {
            signal(SIGUSR1,SIG_IGN);
        }
    }
    if(SIGUSR2 == num)
    {
        static int j = 0 ;
        printf("老妈叫你\n");
        j++;
        if(4== j)
        {
            signal(SIGUSR2,SIG_DFL);
        }

    }
}
int main(int argc, char *argv[])
{
    signal(SIGUSR1,handle1);
    signal(SIGUSR2,handle1);
    while(1)    
    {
        printf("i'm playing pid :%d\n",getpid());
        sleep(1);
    }
    return 0;
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值