进程间通信

一、信号

信号是操作系统中进程间通信的一种方式,它可以在任一时刻发送给某一进程。如果进程不是处于运行态,那么信号就会由内核保存起来,等到恢复运行后再发送。如果信号被进程设置为阻塞,那么就会一直等到进程对其取消阻塞后传递。

Linux中的信号按不同的值来区分,具体被定义在/usr/includebitssignum.h文件中,在程序里通常只需要include<signal.h>即可。

信号来源:

  • 硬件来源:如键盘输入ctrl+c
  • 软件来源:使用命令或者系统调用来发送信号。

用户进程对信号有的响应方式:

  • 执行信号默认操作,每个信号都有与之对应的默认操作
  • 捕捉信号,定义信号处理函数。
  • 忽略信号。可以选择忽略信号对当前进程造成的影响

其中有两个信号是不能被忽略和捕捉的,即SIGKILLSEGSTOP。这样可以方便我们在任何时候结束掉某一进程。

发送信号

在应用程序中,我们可以通过代码来操作信号的发送。例如raise,kill等系统函数。

信号处理

如果我们希望在接收到信号之后进行相应的处理,可以通过signal来注册我们的处理函数,例如:

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

void sighandler(int);

int main()
{
   signal(SIGINT, sighandler);

   while(1) 
   {
      printf("开始休眠一秒钟...\n");
      sleep(1);
   }

   return(0);
}

void sighandler(int signum)
{
   printf("捕获信号 %d,跳出...\n", signum);
   exit(1);
}

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注