一个例子理解kill函数和signal函数是如何进行通信

初学linux中的进程通信,有一些函数调用的流程不是很清楚,下面直接上代码来具体说明一下:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<wait.h>
#include<signal.h>
void func();

main()
{ int child, j;
  signal(17,func);
 if((child=fork())>0) { 
    printf("Parent: Signal is sent to Child! \n");
    kill(child,17);  
    wait(NULL);
    printf("Parent: finished! \n");
  }
   else if(child==0)
   {  
      sleep(10);  
      printf("Child: A signal from Parent is received! \n");
      exit(0); } 
}
void func()
{
	printf("It is signal processing function! \n"); 
}

下面是输出结果:

Parent: Signal is sent to Child! 
It is signal processing function! 
(10秒后)
Child: A signal from Parent is received! 
It is signal processing function! 
Parent: finished! 

通过不断测试代码并且在网上查找资料,我发现17其实是信号量SIGCHLD对应的数值,而SIGCHLD是什么含义呢?翻看我上一篇博客就可以知道,SIGCHLD的意思是当子进程结束时通知父进程,所以kill(child,17)相当于向子进程发送这个信号,signal(17,func)是相当于把SIGCHLD这个信号和func函数绑定在一起。因此第一次利用kill发送信号时会触发一次func函数,之后子进程结束时也会触发一次func函数,所以func函数会被调用两次。

将代码修改为:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<wait.h>
#include<signal.h>
void func();
main()
{ int child, j;
  signal(17,func);
  if((child=fork())>0) { 
    printf("Parent: Signal is sent to Child! \n");
    raise(17);
    wait(NULL);
    printf("Parent: finished! \n");
  }
   else if(child==0)
   {  
	  sleep(10);  
      printf("Child: A signal from Parent is received! \n");
      exit(0); 
   } 
}
void func()
{
	printf("It is signal processing function! \n"); 
}

输出结果不变!
raise函数是向进程本身发送信号,所以kill函数改为raise函数的区别只不过为kill函数是向子进程发送信号了,raise函数是向当前进程发送信号了,发送信号后都会触发func函数。

这个例子里,如果在休眠的10秒之中,通过命令行将子进程杀死的话,子进程的休眠会立刻结束,调用func函数,而不是等到休眠的10秒结束才有所反应。意思也就是说如果子进程是正在休眠时收到信号的,则停止休眠进行信号处理;如果信号是在休眠前或是休眠后收到的则不影响休眠。

上面是我对这个流程的理解,一直在网上没找到什么相关博客,如果理解不对还请大神们指点一下菜鸟。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值